我已经从这里下载并成功运行了ASP.NET Identity示例:https://github.com/rustd/AspnetIdentitySample
我现在正在我的项目中实现ASP.NET Identity框架,遇到了一个问题,这让我一整天都很生气。。。
GetOwinContext()
在我的HttpContext
上不作为扩展方法存在
我正在类库中实现身份框架。我已经安装了Identity框架的所有最新版本(预发布版本),除此之外,一切都很好。
我已经尝试在我的控制器中实现与同一个direct相同的代码,但发现了相同的问题。
我显然在某个地方遗漏了一个参考资料,尽管我不知道。。!。。
杀死我的代码块是:
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
,我可以找到该方法,但当我在解决方案中搜索它时,却找不到它。。。我一定有一些过期的图书馆,但我找不到!
ARGH!
我找到了。。。我没有额外的包裹,叫做Microsoft.Owin.Host.SystemWeb
一旦我搜索并安装了这个,它就工作了。
现在,我不确定我是否只是错过了所有的东西,尽管在阅读各种教程时没有发现这样的库或包的参考。当我安装所有这些Identity框架时,它也没有安装。。。不确定是不是只有我…
EDIT尽管它在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程序集的一部分。
经过反复试验,比较了我的控制器和Asp.Net模板控制器的使用语句
using System.Web;
为我解决了这个问题。您还需要添加:
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.Owin;
使用GetUserManager方法。
Microsoft找不到一种方法来通过右键单击自动解决此问题,并像其他缺少的using语句一样解决?
在我的例子中,通过nuget添加Microsoft.AspNet.WebApi.Owin引用就成功了。
确保安装了nuget包Microsoft.AspNet.Identity.Owin
。然后添加System.Net.Http
命名空间。
仅使用
HttpContext.Current.GetOwinContext()
在我的案例中成功了。
对于在Web API项目中获取此错误的开发人员-
GetOwinContext扩展方法在System.Web.Http.Owin
dll中定义,还需要一个包,即Microsoft.Owin.Host.SystemWeb
。此软件包需要从nuget安装到您的项目中。
链接到程序包:OWIN程序包安装命令-
Install-Package Microsoft.AspNet.WebApi.Owin
链接到System.web包:包安装命令-
Install-Package Microsoft.Owin.Host.SystemWeb
为了解决这个错误,你需要找出它发生在你的案例中的原因。请在您的代码中交叉检查以下几点-
您必须参考
Microsoft.AspNet.Identity.Owin;
使用Microsoft.AspNet.Identity.Owin;
在
HttpContext.Current
下定义GetOwinContext()
如下-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;
我在将代码从一个项目移动到另一个项目时遇到了这个错误。
在API中获取UserManager
return HttpContext.Current.GetOwinContext().GetUserManager<AppUserManager>();
其中,AppUserManager是从UserManager继承的类。
我有所有正确的包和using,但必须先构建GetOwinContext()
才能工作。
只需安装此软件包,您的代码就会工作:=>安装软件包Microsoft.Owin.Host.SystemWeb-2.1.0版