Не удается найти Request.GetOwinContext
Я искал час, пытаясь понять, почему это не работает.
У меня есть приложение ASP.Net MVC 5 с WebAPI. Я пытаюсь получить Request.GetOwinContext(). Аутентификация, однако я не могу найти, как включить GetOwinContext. Вот мой код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web;
using System.Web.Mvc;
using System.Web.Security;
using TaskPro.Models;
namespace TaskPro.Controllers.api
{
public class AccountController : ApiController
{
[HttpPost]
[AllowAnonymous]
public ReturnStatus Login(LoginViewModel model)
{
if (ModelState.IsValid)
{
var ctx = Request.GetOwinContext(); // <-- Can't find this
return ReturnStatus.ReturnStatusSuccess();
}
return base.ReturnStatusErrorsFromModelState(ModelState);
}
}
}
Из того, что я прочитал, он должен быть частью System.Net.Http, но я включил это, и он все еще не разрешает. Ctrl-Space не дает мне никаких вариантов intellisense.
Что мне здесь не хватает?
Ответы
Ответ 1
Метод расширения GetOwinContext
находится в System.Web.Http.Owin
dll, который должен быть загружен как пакет nuget (имя пакета nuget - Microsoft.AspNet.WebApi.Owin)
Install-Package Microsoft.AspNet.WebApi.Owin
См. здесь msdn: http://msdn.microsoft.com/en-us/library/system.net.http.owinhttprequestmessageextensions.getowincontext(v=vs.118).aspx
Пакет Nuget здесь: https://www.nuget.org/packages/Microsoft.AspNet.WebApi.Owin
Однако этот метод по-прежнему является частью пространства имен System.Net.Http
, поэтому определения using
, которые у вас есть, должны быть точными.
ИЗМЕНИТЬ
Хорошо, чтобы устранить некоторую путаницу: если вы используете ApiController (i.e MyController : ApiController
), вам понадобится пакет Microsoft.AspNet.WebApi.Owin
.
Если вы используете обычный контроллер Mvc (т.е. MyController : Controller
), вам понадобится пакет Microsoft.Owin.Host.SystemWeb
.
В MVC 5 конвейеры для Api и обычного MVC были очень разными, но часто имеют одинаковые соглашения об именах. Поэтому метод расширения в одном не применяется к другому. То же самое для многих фильтров действий и т.д.
Ответ 2
Никто из них не работал у меня. Мне пришлось сравнивать пакеты Nuget с тем, который был создан с помощью Identity, и я обнаружил, что этот пакет Nuget отсутствует, когда при добавлении исправлена проблема для меня
Microsoft.Owin.Host.SystemWeb
По-видимому, вам нужно запустить OWIN в IIS с использованием конвейера запросов ASP.NET(читайте, что вы ввернуты без него!)
Ответ 3
В WEB API вы можете получить ссылку, используя следующее:
HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>();
он работает в Identity 2.0
Ответ 4
Вам может потребоваться добавить пакет NuGet Microsoft.Owin.Host.SystemWeb
, чтобы сделать это:
HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>();
Ответ 5
Это потребовало меня навсегда, чтобы найти простой ответ: но то, что я сделал, было использовать расширение Get одного экземпляра IOwinContext, созданного при запуске. Так получилось вот так:
private readonly IOwinContext _iOwinContext = HttpContext.Current.GetOwinContext();
public ApplicationUserManager UserManager
{
get
{
return _userManager ?? _iOwinContext.Get<ApplicationUserManager>() ;
}
private set
{
_userManager = value;
}
}
Ответ 6
У меня есть эта проблема, и я загружаю дополнительный пакет из nuget для решения моей проблемы (выполните следующую команду в консоли диспетчера пакетов)
Установить пакет Microsoft.Owin.Host.SystemWeb
Ответ 7
В моем случае мне нужно добавить
using Microsoft.AspNet.Identity.Owin;
для разрешения GetOwinContext, а затем GetUserManager в следующей строке.
Request.GetOwinContext().GetUserManager<ApplicationUserManager>();
Ответ 8
Метод расширения GetOwinContext()
не найден в потоках, отличных от потока GUI.
Поэтому будьте осторожны, чтобы не вызывать эту функцию из любой функции await
ed.
Ответ 9
После просмотра проекта по умолчанию ASP.NET я обнаружил, что мне нужно включить его в мой запуск приложения:
// Enable the application to use a cookie to store information for the signed in user
// and to use a cookie to temporarily store information about a user logging in
// with a third party login provider
app.UseCookieAuthentication(new CookieAuthenticationOptions());
app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);`
Ответ 10
Мне не хватало пакета: Microsoft.AspNet.WebApi.Owin для ApiControllers.
Надеюсь, это поможет!
Ответ 11
У меня была такая же проблема и она была решена с помощью частного метода:
private IAuthenticationManager AuthenticationManager
{
get
{
return HttpContext.Current.GetOwinContext().Authentication;
}
}
Это работало плавно для меня.