ASP.NET标识 - HttpContext没有GetOwinContext的扩展方法

时间:2014-01-15 21:07:14

标签: c# asp.net asp.net-mvc asp.net-identity

我已经下载了,并从此处成功运行了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;

......这让我起了墙......任何想法?

更新

我查看了Identity&的版本样本中的OWIN,我确保在我的解决方案中有相同的版本。

更多的是,如果我在样本上搜索对象浏览器GetOwinContext我可以找到方法,但是当我在我的解决方案中搜索它时,它无处可寻......我必须有一些库过时了,但我找不到了!

9 个答案:

答案 0 :(得分:663)

哎呀!

我找到了 ...我没有额外的套餐,名为Microsoft.Owin.Host.SystemWeb

一旦我搜索并安装了它,它就可以了。

现在 - 我不确定我是否只是错过了所有内容,但在浏览各种教程时发现没有参考这样的库或包。当我安装所有这个Identity框架时它也没有安装......不确定它是否只是我...

修改 虽然它位于Microsoft.Owin.Host.SystemWeb程序集中,但它是System.Web命名空间中的扩展方法,因此您需要引用前者,并且using是后者。

答案 1 :(得分:167)

如果您在控制器之外,我相信您需要引用当前HttpContext。 MVC控制器具有对当前上下文的基本引用。但是,除此之外,您必须明确声明您想要当前的HttpContext

return HttpContext.Current.GetOwinContext().Authentication;

至于没有显示,使用上面显示的代码(IAuthenticationManager)的新MVC 5项目模板在帐户控制器顶部使用以下语句:

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程序集的一部分。

答案 2 :(得分:21)

在比较我的控制器和Asp.Net模板控制器的使用声明的反复试验之后

using System.Web;

解决了我的问题。 您还需要添加:

using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.Owin;

使用GetUserManager方法。

Microsoft无法通过右键单击自动解决此问题,并像其他缺少使用语句一样解决?

答案 3 :(得分:16)

在我的案例中,通过nuget添加 Microsoft.AspNet.WebApi.Owin 引用做了一个技巧。

答案 4 :(得分:14)

确保您安装了nuget包Microsoft.AspNet.Identity.Owin。然后添加System.Net.Http命名空间。

答案 5 :(得分:3)

我拥有所有正确的软件包和使用方法,但必须先构建才能让GetOwinContext()工作。

答案 6 :(得分:3)

在API中获取UserManager

return HttpContext.Current.GetOwinContext().GetUserManager<AppUserManager>();

其中AppUserManager是继承自UserManager的类。

答案 7 :(得分:3)

对于开发人员而言,在Web API项目中出现此错误-

System.Web.Http.Owin dll中定义了GetOwinContext扩展方法,将需要另外一个软件包,即Microsoft.Owin.Host.SystemWeb。该软件包需要从nuget安装到您的项目中。

Link To Package:OWIN软件包安装命令-

Install-Package Microsoft.AspNet.WebApi.Owin    

Link To System.web Package:软件包安装命令-

Install-Package Microsoft.Owin.Host.SystemWeb

为了解决此错误,您需要找到在您的情况下发生此错误的原因。请交叉检查代码中的以下几点-

  1. 您必须参考Microsoft.AspNet.Identity.Owin;

    使用Microsoft.AspNet.Identity.Owin;

  2. GetOwinContext()下定义HttpContext.Current如下-

     return _userManager1 ?? HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>();
    

    OR

    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;

将我的代码从一个项目移到另一个项目时出现此错误。

答案 8 :(得分:0)

只需安装此软件包,您的代码即可使用:=> 安装软件包Microsoft.Owin.Host.SystemWeb-版本2.1.0