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

Dar*_*ght 367 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;
    }
}
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我可以找到该方法,但是当我在我的解决方案中搜索它时,无处可寻......我必须有一些库过时,但我可以'找到它!

Dar*_*ght 687

哎呀!

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

一旦我搜索并安装了它,它就有效了.

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

编辑 虽然它在Microsoft.Owin.Host.SystemWeb程序集中是System.Web命名空间中的扩展方法,但是你需要引用前者,而using后者.

  • @tne - 谢谢你的评论......虽然我几乎没有"漫无目的地跑来跑去" - 我正在接受来自可靠资源的教程; 来自asp.net网站的努力.他们在他们的教程中没有那个步骤(它已被添加) - 而且,事实上人们正在赞同这个答案,原来的Q也表明我并不是唯一一个有这个问题的人. (21认同)
  • 谢谢你找出一个:我正在使用这个教程http://www.asp.net/identity/overview/getting-started/adding-aspnet-identity-to-an-empty-or-existing-web-forms - 项目,这是一个缺少的步骤 (6认同)
  • @Darren,很公平.(我确实知道我的措辞可能与众不同.) (5认同)
  • 不知道是不是来自更新这个引用,但是我不得不将我的赋值更改为`var authenticationManager = HttpContext.Current.GetOwinContext().身份验证;`(当前包括它不存在的地方题). (5认同)
  • 仅供参考:https://www.nuget.org/packages/Microsoft.Owin.Host.SystemWeb/2.1.0 (3认同)
  • 您还需要`using System.Web;`语句 (2认同)
  • 引用Microsoft.Owin.Host.SystemWeb没有为我做这件事.我正在使用Owin 3.0.1.修复它的是在项目引用中引用System.Web.Http.Owin. (2认同)

Tom*_*mmy 172

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

return HttpContext.Current.GetOwinContext().Authentication;
Run Code Online (Sandbox Code Playgroud)

至于它没有显示,使用您在上面显示的代码(the 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;
Run Code Online (Sandbox Code Playgroud)

注释掉每一个,它GetOwinContext()实际上是System.Web.Mvc程序集的一部分.

  • 这让我失望了.`Controller`类上有一个公共属性`HttpContext`,所以如果你从那继承,`HttpContext.GetOwinContext()`按预期工作.如果你从`ApiController`继承,那么就没有这样的属性.因此,`HttpContext`将引用该类,它将要求您使用"Current"来访问该类的实例.因此,如果您将代码从Controller复制/粘贴到ApiController并想知道它为什么不起作用,那么这就是您的答案. (17认同)
  • @Darren - 我稍微使用了样本模板,可能有你缺少的程序集.看起来你需要从你的类项目中引用`System.Web.Mvc`.当被注释掉时,那就是``HttpContext.GetOwinContext()`变得未知(而不是`Microsoft.Owin.Security`程序集) (2认同)

Ron*_*ger 21

在尝试和错误比较我的控制器和Asp.Net模板控制器的using语句之后

using System.Web;
Run Code Online (Sandbox Code Playgroud)

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

using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.Owin;
Run Code Online (Sandbox Code Playgroud)

使用GetUserManager方法.

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


Dol*_*ita 18

在我的情况下,通过nuget 添加Microsoft.AspNet.WebApi.Owin参考做了一个技巧.


Cod*_*und 14

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

  • @SaturnTechnologies对我来说,另一个包是Microsoft.Owin.Host.SystemWeb和命名空间System.Web (6认同)

Hon*_* P. 8

只是用

HttpContext.Current.GetOwinContext()

在我的情况下做了伎俩.


小智 5

在 API 中获取 UserManager

return HttpContext.Current.GetOwinContext().GetUserManager<AppUserManager>();
Run Code Online (Sandbox Code Playgroud)

其中 AppUserManager 是从 UserManager 继承的类。


Hee*_*lla 5

对于开发人员,在Web API项目中遇到此错误-

GetOwinContext扩展方法在System.Web.Http.Owindll中定义,并且将需要一个以上的软件包,即Microsoft.Owin.Host.SystemWeb。该软件包需要从nuget安装到您的项目中。

链接到软件包:OWIN软件包安装命令-

Install-Package Microsoft.AspNet.WebApi.Owin    
Run Code Online (Sandbox Code Playgroud)

链接到System.web软件包:软件包安装命令-

Install-Package Microsoft.Owin.Host.SystemWeb
Run Code Online (Sandbox Code Playgroud)

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

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

    使用Microsoft.AspNet.Identity.Owin;

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

     return _userManager1 ?? HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>();
    
    Run Code Online (Sandbox Code Playgroud)

    要么

    return _signInManager ?? HttpContext.Current.GetOwinContext().Get<ApplicationSignInManager>();
    
    Run Code Online (Sandbox Code Playgroud)

使用GetOwinContext()的完整代码-

 public ApplicationSignInManager SignInManager
 {
   get
   {
    return _signInManager ?? HttpContext.Current.GetOwinContext().Get<ApplicationSignInManager>();
   }
    private set
    {
     _signInManager = value;
    }
  }
Run Code Online (Sandbox Code Playgroud)

我在使用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;
Run Code Online (Sandbox Code Playgroud)

我将代码从一个项目移动到另一个项目时遇到此错误。


小智 5

只需安装此软件包,您的代码就可以工作:=> Install-Package Microsoft.Owin.Host.SystemWeb -Version 2.1.0