我一直在寻找一小时试图弄清楚为什么这不起作用。
我有一个带有WebAPI的ASP.Net MVC 5应用程序。我正在尝试获取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选项。
我在这里缺少什么?
答案 0 :(得分:146)
GetOwinContext
扩展方法位于System.Web.Http.Owin
dll中需要作为nuget包下载(nuget包名称为Microsoft.AspNet.WebApi.Owin)
Install-Package Microsoft.AspNet.WebApi.Owin
Nuget包在这里:https://www.nuget.org/packages/Microsoft.AspNet.WebApi.Owin
但是,该方法仍然是System.Net.Http
命名空间的一部分,因此您拥有的using
定义应该没问题。
修改强>
好的,要澄清一些困惑:如果您使用的是ApiController(即MyController : ApiController
),则需要Microsoft.AspNet.WebApi.Owin
包。
如果您使用常规Mvc控制器(即MyController : Controller
),则需要Microsoft.Owin.Host.SystemWeb
包。
在MVC 5中,Api和常规MVC的管道非常不同,但通常具有相同的命名约定。因此,一个扩展方法不适用于另一个。对于许多动作过滤器等也是如此。
答案 1 :(得分:47)
这些都不适合我。我不得不将Nuget软件包与使用Identity创建的软件包进行比较,我发现这个Nuget软件包丢失了,当我添加时修复了我的问题
Microsoft.Owin.Host.SystemWeb
显然你需要它使用ASP.NET请求管道在IIS上运行OWIN(如果没有它,请阅读你!)
答案 2 :(得分:42)
在WEB API中,您可以使用以下内容获取参考:
HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>();
它适用于Identity 2.0
答案 3 :(得分:20)
您可能需要添加NuGet包Microsoft.Owin.Host.SystemWeb
才能执行此操作:
HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>();
答案 4 :(得分:7)
在我的情况下,我需要添加
using Microsoft.AspNet.Identity.Owin;
用于解析GetOwinContext,然后在下一行解析GetUserManager。
Request.GetOwinContext().GetUserManager<ApplicationUserManager>();
答案 5 :(得分:4)
I have this problem and I download extra package from nuget to solve my problem,(run following command in Package Manager Console) Install-Package Microsoft.Owin.Host.SystemWeb
答案 6 :(得分:2)
这让我永远找到了一个简单的答案:但我所做的是使用在启动时实例化的IOwinContext的单个实例的Get扩展。所以它出现了这样:
private readonly IOwinContext _iOwinContext = HttpContext.Current.GetOwinContext();
public ApplicationUserManager UserManager
{
get
{
return _userManager ?? _iOwinContext.Get<ApplicationUserManager>() ;
}
private set
{
_userManager = value;
}
}
答案 7 :(得分:1)
在GUI线程以外的线程中找不到GetOwinContext()
扩展方法。
因此请注意不要在任何await
ed函数中调用此函数。
答案 8 :(得分:1)
在查看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);`
答案 9 :(得分:1)
我缺少包:ApiControllers的Microsoft.AspNet.WebApi.Owin。 希望这有帮助!
答案 10 :(得分:1)
我遇到了同样的问题并使用私有方法解决了这个问题:
private IAuthenticationManager AuthenticationManager
{
get
{
return HttpContext.Current.GetOwinContext().Authentication;
}
}
这对我来说很有效。
答案 11 :(得分:1)
(请注意,这个答案适用于ASP.NET Web API,它对应于问题中使用的标记。如果您的查询是关于ASP.NET MVC,请参阅this question。)
该问题未指定ASP.NET Web API服务如何hosted。 this post中的对话框表示(强调我的):
kichalla于2014年10月24日上午1:35写道
如果您不是自托管,请不要使用 Microsoft.AspNet.WebApi.Owin 与IIS打包...这个包只能与 self一起使用 托管强>
accepted answer建议使用Microsoft.AspNet.WebApi.Owin
包。在这个答案中,我报告了当在IIS中托管ASP.NET Web API服务时对我有用的东西。
首先,安装以下NuGet包:
<强> Microsoft.Owin.Host.SystemWeb 强>
OWIN服务器,它允许基于OWIN的应用程序在IIS上运行 ASP.NET请求管道。
(请注意,在我写的时候,这个NuGet软件包的最新版本是 3.1.0 。另外,在可能重要的范围内,我使用的是Visual Studio 2013 Update 5.)
安装此NuGet软件包后,您可以执行以下操作:
using Microsoft.Owin;
using System.Web;
IOwinContext context = HttpContext.Current.GetOwinContext();
// or
IOwinContext context = HttpContext.Current.Request.GetOwinContext();
现在,阐明如何解决这些陈述。在Visual Studio中,如果右键单击任一语句中的GetOwinContext
并选择&#34; Peek Definition,&#34; Visual Studio将显示以下内容:
// Assembly Microsoft.Owin.Host.SystemWeb.dll, v3.1.0.0
using Microsoft.Owin;
using System;
using System.Runtime.CompilerServices;
namespace System.Web
{
public static class HttpContextExtensions
{
public static IOwinContext GetOwinContext(this HttpContext context);
public static IOwinContext GetOwinContext(this HttpRequest request);
}
}
如您所见,在System.Web
命名空间内,有两个 GetOwinContext
扩展方法:
HttpContext
上的一个,HttpRequest
上的另一个。同样,对于那些在IIS中托管其Web API服务的人,我希望这清除了关于2017年这个晚期可以找到GetOwinContext
的定义的任何含糊不清。
答案 12 :(得分:0)
我必须添加包Microsoft.AspNet.Identity.Owin