关于c#:ASP.NET Identity – HttpContext没有GetOwinContext的扩展方法

ASP.NET Identity - HttpContext has no extension method for GetOwinContext

我已从以下位置下载并成功运行了ASP.NET标识示例:https://github.com/rustd/aspnetidentitysample

我现在正在项目中实现ASP.NET标识框架,遇到了一个问题,这让我整天发疯……

GetOwinContext() does not exist as an extension method on my HttpContext

我正在类库中实现身份框架。我已经安装了身份框架的所有最新版本(预发布版本),除此之外,一切都正常工作。

我尝试在控制器中实现与同一个Direct相同的代码,并发现了相同的问题。

很明显,我在某个地方遗漏了一个参考资料,尽管我不知道是什么。我是说…

杀死我的代码块是:

1
2
3
4
5
6
7
private IAuthenticationManager AuthenticationManager
{
    get
    {
        return HttpContext.GetOwinContext().Authentication;
    }
}

我已经添加了对以下内容的引用-在我的类库中尝试了这两种方法,也直接在控制器上尝试了这两种方法,它们都不适合我……

1
2
3
4
5
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.EntityFramework;
using Microsoft.Owin.Security;
using Microsoft.Owin;
using System.Web;

……这把我逼疯了……知道吗?

更新

我在示例中检查了Identity&Owin的版本,并确保我的解决方案中有相同的版本。

更重要的是,如果我在示例的对象浏览器中搜索GetOwinContext,我可以找到该方法,但是当我在解决方案中搜索它时,却找不到它……我一定有过期的图书馆,但我找不到!


啊!

我找到了它…我没有额外的包裹,叫Microsoft.Owin.Host.SystemWeb

一旦我搜索并安装了这个,它就工作了。

现在-我不确定我是否错过了所有的东西,尽管在阅读各种教程时没有发现对这样一个库或包的引用。当我安装所有这些标识框架时,它也没有安装…不知道是不是只有我……

编辑虽然它在Microsoft.Owin.Host.SystemWeb程序集中,但它是System.Web名称空间中的一个扩展方法,因此需要引用前者,并将其作为using后者。


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

1
return HttpContext.Current.GetOwinContext().Authentication;

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

1
2
3
4
5
6
7
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模板控制器的使用语句之后

1
using System.Web;

帮我解决了这个问题。您还需要添加:

1
2
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()

在我的案子里耍了花招。


在API中获取用户管理器

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

其中,AppUserManager是从UserManager继承的类。


我有所有正确的软件包和使用方法,但在让GetOwinContext()工作之前,我必须先进行构建。


对于在Web API项目中获取此错误的开发人员-

getowincontext扩展方法在System.Web.Http.Owindll中定义,还需要一个包,即Microsoft.Owin.Host.SystemWeb。此包需要从nuget安装到您的项目中。

链接到package:owin package安装命令-

1
Install-Package Microsoft.AspNet.WebApi.Owin

链接到system.web包:包安装命令-

1
Install-Package Microsoft.Owin.Host.SystemWeb

为了解决这个错误,您需要找到它在您的案例中发生的原因。请在您的代码中勾选以下几点-

  • 你必须参考Microsoft.AspNet.Identity.Owin;

    使用Microsoft.aspnet.identity.owin;

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

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

    1
    return _signInManager ?? HttpContext.Current.GetOwinContext().Get<ApplicationSignInManager>();
  • 使用getowInContext()的完整代码-

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     public ApplicationSignInManager SignInManager
     {
       get
       {
        return _signInManager ?? HttpContext.Current.GetOwinContext().Get<ApplicationSignInManager>();
       }
        private set
        {
         _signInManager = value;
        }
      }

    我在使用getowInContext()的代码文件中使用的命名空间

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    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;

    在将代码从一个项目移动到另一个项目时,出现了此错误。