ASP.NET Identity - HttpContext не имеет метода расширения для GetOwinContext

384

Я скачал и успешно запустил образец удостоверения ASP.NET отсюда: https://github.com/rustd/AspnetIdentitySample

Сейчас я нахожусь в процессе реализации ASP.NET Identity Framework в моем проекте и столкнулся с проблемой, которая приводила меня в бешенство весь день ...

GetOwinContext() не существует в качестве метода расширения на моем HttpContext

Я реализую структуру идентичности в библиотеке классов. Я установил все последние (предварительные версии) платформы Identity, и все - кроме этого - работает нормально.

Я попытался реализовать тот же код, что и тот же прямой в моем контроллере, и обнаружил ту же проблему.

Я явно пропускаю ссылку где-то, хотя понятия не имею, что ..! ..

Блок кода, который убивает меня:

private IAuthenticationManager AuthenticationManager
{
    get
    {
        return HttpContext.GetOwinContext().Authentication;
    }
}

Я добавил ссылки на следующее - пробовал их как в моей библиотеке классов, так и непосредственно на контроллере, ни одна из них не работает для меня ...

using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.EntityFramework;
using Microsoft.Owin.Security;
using Microsoft.Owin;
using System.Web;

... это доводит меня до стены ... есть идеи?

ОБНОВИТЬ

Я проверил версии Identity & OWIN в образце и убедился, что в моем решении есть те же версии.

Более того, если я поищу в браузере объектов образец, GetOwinContextя смогу найти метод, однако, когда я ищу его в своем решении, его нигде не найти ... У меня должна быть какая-то библиотека устаревшая, но я не могу ' не найти это!

Даррен Уэйнрайт
источник

Ответы:

713

ARGH!

Я нашел это ... У меня не было дополнительного пакета, названногоMicrosoft.Owin.Host.SystemWeb

Как только я искал и установил это, это работало.

Теперь - я не уверен, что просто пропустил все, хотя не нашел ссылки на такую ​​библиотеку или пакет при прохождении различных уроков. Он также не был установлен, когда я установил всю эту платформу Identity ... Не уверен, что это был только я ...

РЕДАКТИРОВАТЬ Несмотря на то, что Microsoft.Owin.Host.SystemWebон находится в сборке, он является методом расширения в System.Webпространстве имен, поэтому вам нужно иметь ссылку на первое и быть usingпоследним.

Даррен Уэйнрайт
источник
6
Спасибо, что выяснили это : я использую этот учебник asp.net/identity/overview/getting-started/… и этот шаг пропущен
frenchie
23
@tne - спасибо за ваш комментарий ... хотя я с трудом "бесцельно бегал" - я следовал учебному пособию из надежного ресурса; с сайта asp.net не менее. У них не было этого шага в их уроке (он был добавлен) - также тот факт, что люди голосуют и за этот ответ, и за исходный Q, также указывает на то, что я был не единственным с этой проблемой.
Даррен Уэйнрайт,
5
@ Darren, достаточно справедливо. (Я понимаю , что я мог бы сформулировать это по- другому.)
Tne
3
Просто для справки: nuget.org/packages/Microsoft.Owin.Host.SystemWeb/2.1.0
Крис Богатка,
5
Не знаю, было ли это из-за обновления этой ссылки, но мне пришлось немного изменить свое назначение на var authenticationManager = HttpContext.Current.GetOwinContext().Authentication;(Текущий включен там, где его не было в вопросе).
Ortund
177

Я считаю, что вам нужно ссылаться на ток, HttpContextесли вы находитесь за пределами контроллера. Контроллеры MVC имеют базовую ссылку на текущий контекст. Однако, помимо этого, вы должны явно объявить, что хотите текущийHttpContext

return HttpContext.Current.GetOwinContext().Authentication;

Что касается того, что он не отображается, новый шаблон проекта MVC 5, использующий код, показанный выше ( IAuthenticationManager), имеет следующие операторы использования в верхней части контроллера учетных записей:

using System.Threading.Tasks;
using System.Web;
using System.Web.Mvc;
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.EntityFramework;
using Microsoft.Owin.Security;
using WebApplication2.Models;

Закомментируя каждый, он, по-видимому, GetOwinContext()является частью сборки System.Web.Mvc.

Томми
источник
Пробовал это и просто не могу найти это. - GetOwinContext () я имею в виду.
Даррен Уэйнрайт
2
@Darren - Я немного поиграл с образцом шаблона и, возможно, вам не хватает сборки. Похоже, вам понадобится ссылка System.Web.Mvcиз вашего проекта класса. Когда закомментировано, это то, что заставило HttpContext.GetOwinContext()стать неизвестным (а не Microsoft.Owin.Securityсборка)
Томми
Я пытался заставить это работать непосредственно на контроллере - и снова не могу найти это.
Даррен Уэйнрайт
19
Это сбило меня с толку. Существует общественное свойство HttpContextна Controllerклассе, так что если вы унаследовали от того, HttpContext.GetOwinContext()работает , как ожидалось. Если вы наследуете от этого ApiController, такого свойства не существует. Следовательно, HttpContextбудет ссылаться на класс, который вам потребуется использовать Currentдля доступа к экземпляру класса. Поэтому, если вы копируете / вставляете код из контроллера в ApiController и удивляетесь, почему он не работает, это ответ для вас.
Дэвид Миани
«Текущий» стал для меня
нажмите Ok
24

После проб и ошибок сравнивая операторы используя мой контроллер и контроллер шаблона Asp.Net

using System.Web;

Решил проблему для меня. Вы также должны будете добавить:

using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.Owin;

Использовать метод GetUserManager.

Microsoft не может найти способ решить это автоматически с помощью щелчка правой кнопкой мыши и решить, как другие пропущенные с помощью операторов?

Ронен Фестингер
источник
1
Это сработало и для меня. У меня уже были библиотеки Identity, но, похоже, нужен System.Web.
SouthShoreAK
1
По-видимому, это происходит очень часто, как в сборках, так и в пространствах имен. Делает это действительно болезненным, потому что это метод расширения. Я обновил все свои библиотеки, и этот ответ отражает, где он находится в данный момент.
Шеннон
Ах, вы, черт возьми, в новой форме
JustJohn
1
Да, к сожалению, методы расширения не могут быть разрешены автоматически.
Ронен Фестингер
22

В моем случае добавление ссылки Microsoft.AspNet.WebApi.Owin через nuget помогло.

Сладкая жизнь
источник
Да, это было сделано для меня в текущей последней версии. Метод расширения находится в этом пакете, который является сборкой System.Web.Http.Owin и внутри пространства имен System.Net.Http.
oatsoda
16

Убедитесь, что вы установили пакет nuget Microsoft.AspNet.Identity.Owin. Затем добавьте System.Net.Httpпространство имен.

CodeNotFound
источник
У меня был тот тоже. Оказывается, была еще одна библиотека, НЕ установленная, когда был установлен компонент Identity.
Даррен Уэйнрайт
@Darren Пожалуйста, добавьте название пакета. Спасибо
Сатурн Технологии
6
@SaturnTechnologies Для меня другим пакетом был Microsoft.Owin.Host.SystemWeb и пространство имен System.Web
WiSeeker,
1
Я второй WiSeeker. Для меня это не помогло. Предложение Даррена установить Microsoft.Owin.Host.SystemWebвсе же сработало.
Макс Барракло
13

Просто используя

HttpContext.Current.GetOwinContext ()

сделал свое дело в моем случае.

Хонза П.
источник
10

Для разработчиков, получающих эту ошибку в Web API Project -

Метод расширения GetOwinContext определен в System.Web.Http.Owindll, и потребуется еще один пакет, т.е.Microsoft.Owin.Host.SystemWeb . Этот пакет должен быть установлен в вашем проекте из nuget.

Ссылка на пакет : Команда установки пакета OWIN -

Install-Package Microsoft.AspNet.WebApi.Owin    

Ссылка на пакет System.web : команда установки пакета -

Install-Package Microsoft.Owin.Host.SystemWeb

Чтобы устранить эту ошибку, вам необходимо выяснить причину ее возникновения в вашем случае. Пожалуйста, проверьте ниже пункты в вашем коде -

  1. Вы должны иметь ссылку на Microsoft.AspNet.Identity.Owin;

    использование Microsoft.AspNet.Identity.Owin;

  2. Определить GetOwinContext()под HttpContext.Currentкак ниже -

     return _userManager1 ?? HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>();

    ИЛИ

    return _signInManager ?? HttpContext.Current.GetOwinContext().Get<ApplicationSignInManager>();

Полный код, где используется GetOwinContext () -

 public ApplicationSignInManager SignInManager
 {
   get
   {
    return _signInManager ?? HttpContext.Current.GetOwinContext().Get<ApplicationSignInManager>();
   }
    private set
    {
     _signInManager = value;
    }
  }

Пространство имен, которое я использую в файле кода, где используется GetOwinContext ()

using AngularJSAuthentication.API.Entities;
using AngularJSAuthentication.API.Models;
using HomeCinema.Common;
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.EntityFramework;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Web;
using Microsoft.AspNet.Identity.Owin;
using Microsoft.Owin.Security.DataProtection;

Я получил эту ошибку при перемещении моего кода из одного проекта в другой.

Хееманшу Бхалла
источник
4

Получить UserManager в API

return HttpContext.Current.GetOwinContext().GetUserManager<AppUserManager>();

где AppUserManager - это класс, который наследуется от UserManager.

Ашраф Махер
источник
4

У меня были все правильные пакеты и использование, но мне пришлось сначала собрать их, прежде чем я смог приступить GetOwinContext()к работе.

Кевин Раффей
источник
Как вы исправили свою сборку, чтобы она работала с первого раза?
Нордес
@Nordes Иногда VS не удается собрать в фоновом режиме (то есть: он сообщает вам, что есть ошибки компиляции), но запуск реальной сборки (или чаще очистка, а затем сборка) поможет. Скорее всего, это пережил Кевин.
Маверик
0

Просто установите этот пакет, и ваш код будет работать: => Install-Package Microsoft.Owin.Host.SystemWeb -Version 2.1.0

Мухаммед Айяз
источник