Я загрузил и успешно выполнил образец ASP.NET Identity отсюда: https://github.com/rustd/AspnetIdentitySample
Я сейчас посередине реализации структуры ASP.NET Identity в своем проекте и столкнулся с проблемой, которая сбила меня с ума весь день...
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;
... это подталкивает меня к стене... любая идея?
UPDATE
Я проверил версии Identity и OWIN в образце, и я убедился, что у меня есть те же версии в моем решении.
Более того, если я ищу браузер объектов на образце для GetOwinContext
, я могу найти этот метод, однако, когда я его ищу в своем решении, его не найти... Я должен иметь некоторую библиотеку из дата, но я не могу ее найти!
ARGH!
Я нашел его... У меня не было дополнительного пакета, называемого Microsoft.Owin.Host.SystemWeb
Как только я выполнил поиск и установил это, он сработал.
Теперь - я не уверен, что я просто пропустил все, но не нашел ссылки на такую библиотеку или пакет при просмотре различных учебных пособий. Он также не установился, когда я установил всю эту систему Identity... Не уверен, что это был только я..
ИЗМЕНИТЬ
Хотя это в сборке Microsoft.Owin.Host.SystemWeb
, это метод расширения в пространстве имен System.Web
, поэтому вам нужно иметь ссылку на первое и быть using
последним.
Я считаю, что вам нужно ссылаться на текущий 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.
System.Web.Mvc
из вашего проекта класса. Когда это закомментировано, это то, что заставило HttpContext.GetOwinContext()
стать неизвестным (а не сборкой Microsoft.Owin.Security
)
После проб и ошибок, сравнивающих операторы использования моего контроллера и контроллера шаблона Asp.Net
using System.Web;
Решил проблему для меня. Вам также нужно добавить:
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.Owin;
Использовать метод GetUserManager.
Microsoft не смогла найти способ разрешить это автоматически, щелкнув правой кнопкой мыши и решив, как другие отсутствующие операторы использования?
в моем случае добавление Microsoft.AspNet.WebApi.Owin refference через nuget сделал трюк.
Убедитесь, что вы установили пакет nuget Microsoft.AspNet.Identity.Owin
. Затем добавьте пространство имен System.Net.Http
.
У меня были все правильные пакеты и приложения, но мне пришлось сначала создать, прежде чем я смогу заставить GetOwinContext() работать.
Чтобы получить UserManager в API
return HttpContext.Current.GetOwinContext().GetUserManager<AppUserManager>();
где AppUserManager - это класс, который наследуется от UserManager.