我已经从这里下载并成功运行了ASP.NET Identity示例:https: //github.com/rustd/AspnetIdentitySample
我现在正在我的项目中实现ASP.NET Identity框架,并遇到了一个问题,这让我整天都疯了......
GetOwinContext()不存在作为我的扩展方法HttpContext
我正在类库中实现身份框架.我已经安装了Identity框架的所有最新版本(预发布版本),除此之外的所有内容都正常工作.
我尝试在我的控制器中实现与直接相同的代码,并找到相同的问题.
我显然错过了某个地方的参考,虽然我不知道是什么..!..
杀死我的代码块是:
private IAuthenticationManager AuthenticationManager
{
get
{
return HttpContext.GetOwinContext().Authentication;
}
}
Run Code Online (Sandbox Code Playgroud)
我添加了对以下内容的引用 - 在我的类库中尝试了这些并且也直接在控制器上,它们都不适合我...
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.EntityFramework;
using Microsoft.Owin.Security;
using Microsoft.Owin;
using System.Web;
Run Code Online (Sandbox Code Playgroud)
......这让我起了墙......任何想法?
UPDATE
我已经检查了示例中Identity和OWIN的版本,并确保我的解决方案中有相同的版本.
更重要的是,如果我在样本上搜索对象浏览器,GetOwinContext我可以找到该方法,但是当我在我的解决方案中搜索它时,无处可寻......我必须有一些库过时,但我可以'找到它!
我只是试图了解webapi,webhost(iis)和owin之间的关系.我会写下我目前的理解,并请你告诉我它是否正确.
Microsoft.Owin.Host.SystemWeb,Microsoft.AspNet.WebApi.WebHost)是更高级API(如Webapi)和IIS之间的层.由于Webapi最初是独立于主机的,因此需要一个中间层来使其在特定主机(如IIS)上运行.Webapi(Microsoft.AspNet.WebApi.WebHost)的Webhost 提供了这一层.稍后还将有Owin(Microsoft.Owin.Host.SystemWeb)的Webhost层,允许在IIS上托管Owin兼容的任何东西.Microsoft.Owin.Host.SystemWeb了Webhost ()(类似于Webapi带来的Webhost),允许Owin应用程序在IIS上托管.它还带有自托管(Microsoft.Owin.SelfHost),允许Owin应用程序托管在任何可执行文件中.就Webapi而言,Owin还为Owap主机提供了Webapi(Microsoft.AspNet.WebApi.Owin),允许在Owin堆栈上运行WebApi.以上所有意味着一个人有两种不同的方式在IIS上托管Webapi.它可以在没有Owin的情况下使用Webapi WebHost完成,也可以使用Owin Host for Webapi和Webhost for Owin完成.
Nuget参考:
这种理解是否正确?
从Asp.Net Identity 2.0示例复制以下代码.
private ApplicationUserManager _userManager;
public ApplicationUserManager UserManager
{
get
{
return // Error
_userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
}
private set
{
_userManager = value;
}
}
Run Code Online (Sandbox Code Playgroud)
但是它会出现以下错误?
错误3'Microsoft.Owin.IOwinContext'不包含'GetUserManager'的定义,并且没有扩展方法'GetUserManager'接受类型为'Microsoft.Owin.IOwinContext'的第一个参数'(您是否缺少using指令或装配参考?)
更新:
Microsoft.AspNet.Identity.Owin.dll的版本2已存在于...\packages\Microsoft.AspNet.Identity.Owin.2.0.1\lib \net45中.
但是,HttpContext.GetOwinContext()我的项目和样本之间的视图定义是不同的.我项目的前三行是
#region Assembly Microsoft.Owin.Host.SystemWeb.dll, v2.0.0.0 // C:\......\packages\Microsoft.Owin.Host.SystemWeb.2.0.0\lib\net45\Microsoft.Owin.Host.SystemWeb.dll #endregion
而样本是
#region Assembly Microsoft.Owin.Host.SystemWeb.dll, v2.1.0.0 // C:\....\sample\packages\Microsoft.Owin.Host.SystemWeb.2.1.0\lib\net45\Microsoft.Owin.Host.SystemWeb.dll #endregion
但我已经使用Neget将所有Owin Nuget软件包更新到最新版本.
我决定使用ASP.NET身份的帐户确认和密码恢复.我正在使用Identity 2.1.0.我将NuGet中的示例MVC应用程序安装到一个空项目中,以便我可以看看它是如何配置的.
将更改合并到我的项目后,有一个错误,我不明白如何解决:
'Microsoft.Owin.IOwinContext'不包含'GetUserManager'的定义,并且没有扩展方法'GetUserManager'接受类型为'Microsoft.Owin.IOwinContext'的第一个参数'(您是否缺少using指令或程序集引用) ?)C:\ Users\xxxxx\Source\Repos\xxxxxx\xxxxxx\xxxxxx\Controllers\AccountController.cs 48 69 xxx xxx xxx
我的AccountController.cs中抛出了错误:
public ApplicationUserManager UserManager
{
get
{
return _userManager ??
HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
}
private set
{
_userManager = value;
}
}
Run Code Online (Sandbox Code Playgroud)
在示例应用程序和我的项目中,我在属性中看到两个项目都安装了Microsoft.AspNet.Identity.Owin版本2.0.0.0.
当我右键单击我的项目和Goto定义中的GetOwinContext()时,它显示元数据来自Assembly Microsoft.Owin.Host.SystemWeb.dll, v2.1.0.0,但当我点击Microsoft.Owin.Host.SystemWeb引用时我在属性中看到它只是版本2.0.0.0 - 不仅这看起来很奇怪,但它也与显示2.1.0.0的示例应用程序不同. - 这是我能找到的唯一区别.
除了上面的粗体段落之外,我没有发现任何差异.这似乎不对,但我不确定,如果错误,我不知道如何修复它.