ASP.NET身份-HttpContext没有GetOwinContext的扩展方法


384

我已经从这里下载并成功运行了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可以找到该方法,但是在我的解决方案中搜索它时,找不到它了……我必须拥有一些过时的库,但是我可以找不到它!

Answers:


712

啊!

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

一旦我搜索并安装了它,它就起作用了。

现在-我不确定我是否错过了所有内容,尽管在进行各种教程时未找到对此类库或包的引用。当我安装了所有的Identity框架时,也没有安装它。。。不确定是不是我。

编辑 尽管它在Microsoft.Owin.Host.SystemWeb程序集中,但它是System.Web名称空间中的扩展方法,因此您需要引用前者,并成为using后者。


6
感谢您弄清楚这一点:我正在使用本教程asp.net/identity/overview/getting-started / ...,这是一个缺少的步骤
Frenchie 2014年

23
@tne-谢谢您的评论...尽管我几乎没有'漫无目的地奔跑'-我正在遵循来自可靠资源的教程;来自asp.net站点。他们在教程中没有采取这一步骤(此功能已被添加)-此外,人们都赞成这个答案,而原始的Q也表明我不是唯一遇到此问题的人。
达伦·温赖特

5
@Darren,很公平。(我意识到我本可以用不同的措词。)
2014年


5
不知道这是否来自更新此参考文献,但是我不得不将我的作业稍微修改为var authenticationManager = HttpContext.Current.GetOwinContext().Authentication;(当前包含了问题中没有的地方)。
Ortund

177

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

return HttpContext.Current.GetOwinContext().Authentication;

关于未显示的问题,使用您上面显示的代码(IAuthenticationManager)的新MVC 5项目模板在帐户控制器的顶部具有以下using语句:

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


一直在尝试,但找不到它。-我的意思是GetOwinContext()。
Darren Wainwright 2014年

2
@Darren-我玩了一些示例模板,可能缺少您要的程序集。看起来您将需要System.Web.Mvc从您的课程项目中引用。当被注释掉时,这就是HttpContext.GetOwinContext()变得未知(而不是Microsoft.Owin.Security大会)的原因
Tommy

我一直试图使它也可以直接在控制器上工作-再次找不到它。
Darren Wainwright 2014年

19
这让我绊倒了。有一个公共财产HttpContext上的Controller类,所以如果从继承,HttpContext.GetOwinContext()按预期工作。如果您从中继承ApiController,则没有此类属性。因此,HttpContext将引用该类,这将要求您使用它Current来访问该类的实例。因此,如果您将代码从Controller复制/粘贴到ApiController并想知道为什么它不起作用,那么这就是您的答案。
David Miani 2014年

“当前”是我的难题
单击“确定

24

经过反复试验,比较了我的控制器和Asp.Net Template控制器的using语句

using System.Web;

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

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

要使用GetUserManager方法。

Microsoft无法找到一种方法,可以通过右键单击来自动解决此问题,并像其他缺少的using语句一样进行解决?


1
这也为我工作。我已经有了身份库,但是似乎需要System.Web。
SouthShoreAK 2015年

1
显然,无论是在程序集还是在名称空间中,它都在不断发展。作为扩展方法,这真的很痛苦。我已经更新了所有库,并且此答案反映了当前的位置。
香农2015年

啊,您的dll地狱将以一种新的形式出现
-JustJohn

1
是的,遗憾的是,扩展方法无法自动解决。
罗南·费辛格

22

就我而言,通过nuget 添加Microsoft.AspNet.WebApi.Owin引用可以解决问题。


是的,这对我来说是最新版本。扩展方法在此Package中,即Assemby System.Web.Http.Owin命名空间 System.Net.Http中
oatsoda

16

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


我也有那个。原来,在安装Identity资料时还没有安装另一个库。
Darren Wainwright 2014年

@Darren请添加包裹名称。谢谢
Saturn Technologies

6
@SaturnTechnologies对我来说,另一个软件包是Microsoft.Owin.Host.SystemWeb和名称空间System.Web
WiSeeker

1
我第二次WiSeeker。对我来说,这没有帮助。达伦(Darren)的安装建议可以解决问题Microsoft.Owin.Host.SystemWeb
Max Barraclough

13

只是使用

HttpContext.Current.GetOwinContext()

在我的情况下做到了。


10

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

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

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

Install-Package Microsoft.AspNet.WebApi.Owin    

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

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>();

    要么

    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;

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



4

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


您如何修复构建以使其首次运行?
Nordes

@Nordes有时VS无法在后台构建(即:它告诉您存在编译错误),但是触发真正的构建(或更常见的情况是先清理然后再构建)将使其通过。这可能是凯文正在经历的事情。
Maverick

0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.