ChatGPT解决这个技术问题 Extra ChatGPT

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

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


P
PeteGO

啊!

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

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

现在 - 我不确定我是否错过了所有内容,尽管在浏览各种教程时没有发现对这样的库或包的引用。当我安装所有这些身份框架时,它也没有安装......不确定它是否只是我......

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


感谢您弄清楚这一点:我正在使用本教程 asp.net/identity/overview/getting-started/…,这是一个缺失的步骤
@tne - 感谢您的评论......虽然我几乎没有“漫无目的地跑来跑去” - 我正在学习来自受信任资源的教程;来自 asp.net 网站。他们的教程中没有这一步(后来添加了)-而且,人们对这个答案和原始 Q 都表示赞同这一事实也表明我不是唯一一个遇到这个问题的人。
@Darren,很公平。 (我确实意识到我可以用不同的措辞。)
不知道它是否来自更新此参考,但我不得不将我的作业稍微更改为 var authenticationManager = HttpContext.Current.GetOwinContext().Authentication;(当前包括问题中不存在的地方)。
T
Tommy

如果您在控制器之外,我相信您需要引用当前的 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 - 我对示例模板进行了一些操作,并且可能缺少您缺少的程序集。看起来您需要从您的课程项目中引用 System.Web.Mvc。注释掉时,这就是使 HttpContext.GetOwinContext() 变得未知的原因(而不是 Microsoft.Owin.Security 程序集)
我也一直试图让它直接在控制器上工作 - 又找不到它。
这让我绊倒了。 Controller 类上有一个公共属性 HttpContext,因此如果您从该类继承,HttpContext.GetOwinContext() 将按预期工作。但是,如果您从 ApiController 继承,则没有此类属性。因此,HttpContext 将引用该类,这将要求您使用 Current 来访问该类的实例。因此,如果您将代码从 Controller 复制/粘贴到 ApiController 并想知道为什么它不起作用,这就是您的答案。
“当前”是我的问题
R
Ronen Festinger

经过反复试验比较我的控制器和 Asp.Net 模板控制器的使用语句

using System.Web;

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

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

使用 GetUserManager 方法。

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


这也对我有用。我已经有了身份库,但它似乎需要 System.Web。
这显然已经在程序集和命名空间中移动了很多。让它成为一种扩展方法真的很痛苦。我已经更新了我所有的库,这个答案反映了它目前的位置。
啊,你的 dll 地狱在一个新的形状
是的,可悲的是,扩展方法无法自动解决。
K
Krishna Teja

在我的情况下,通过 nuget 添加 Microsoft.AspNet.WebApi.Owin 参考就可以了。


是的,这是在当前最新版本上为我完成的。扩展方法在这个包中,它是 Assemby System.Web.Http.Owin 和命名空间 System.Net.Http
S
Syed Ali hassan

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


我也有那个。原来在安装 Identity 的东西时没有安装另一个库。
@Darren 请添加包名。谢谢
@SaturnTechnologies 对我来说,另一个包是 Microsoft.Owin.Host.SystemWeb 和命名空间 System.Web
我第二个WiSeeker。对我来说,这没有帮助。不过,Darren 的安装 Microsoft.Owin.Host.SystemWeb 的建议起到了作用。
H
Honza P.

只是使用

HttpContext.Current.GetOwinContext()

在我的情况下成功了。


H
Heemanshu Bhalla

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

GetOwinContext 扩展方法在 System.Web.Http.Owin dll 中定义,还需要一个包,即 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

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

您必须参考 Microsoft.AspNet.Identity.Owin;使用 Microsoft.AspNet.Identity.Owin;在 HttpContext.Current 下定义 GetOwinContext() 如下 - 返回 _userManager1 ?? HttpContext.Current.GetOwinContext().GetUserManager();或返回 _signInManager ?? HttpContext.Current.GetOwinContext().Get();

使用 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;

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


A
Ashraf Maher

在 API 中获取 UserManager

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

其中 AppUserManager 是继承自 UserManager 的类。


C
CodeNotFound

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


你是如何修复你的构建以使其第一次工作的?
@Nordes 有时VS无法在后台构建(即:它告诉您存在编译错误),但触发真正的构建(或更常见的是清理然后构建)将使其通过。这很可能是凯文正在经历的事情。
M
Muhammad Ayyaz

只需安装这个包,你的代码就可以工作了:=> Install-Package Microsoft.Owin.Host.SystemWeb -Version 2.1.0