【问题标题】:HttpContext does not contain a definition for SignOutAsyncHttpContext 不包含 SignOutAsync 的定义
【发布时间】:2018-08-07 08:10:43
【问题描述】:

我正在尝试编写一个自定义身份验证管理器,它将在我的 ASP .Net Core 2.x 应用程序中处理用户登录和注销以及许多其他内容,但我一开始就卡住了。

我尝试了this Microsoft Article 中建议的方式,但是当我尝试实现登录时,它显示HttpContext does not contain a definition for SignOutAsync 错误。我有文章中建议的所有参考资料:

public async void SignIn(HttpContext httpContext, UserDbModel user, bool isPersistent = false)
        {
            ClaimsIdentity identity = new ClaimsIdentity(this.GetUserClaims(user), CookieAuthenticationDefaults.AuthenticationScheme);
            ClaimsPrincipal principal = new ClaimsPrincipal(identity);
            await HttpContext.SignInAsync(IdentityConstants.ApplicationScheme);
        }

以下代码有效,但已过时:

await HttpContext.Authentication.SignOutAsync(...)

类中的引用:

using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Authentication;

这里缺少什么?也许这些扩展方法在新版本中被删除了,如果是这样......我如何以正确的方式实现身份验证?

【问题讨论】:

  • 您是否在项目引用中引用了库Microsoft.AspNetCore.Authentication.Abstractions? (另见AuthenticationHttpContextExtensions.SignInAsync Method
  • 看到您的评论后,我安装了地址为Microsoft.AspNetCore.Authentication.Abstractions 的nuget 包,但错误未解决。
  • @igor 我需要在类文件中引用它吗? using Microsoft.AspNetCore.Authentication.Abstractions,因为它会导致错误...
  • 它是命名空间Microsoft.AspNetCore.Authentication中的扩展。您还应该能够使用 call Microsoft.AspNetCore.Authentication.AuthenticationHttpContextExtensions.SignInAsync(HttpContext, IdentityConstants.ApplicationScheme) 访问该方法
  • 也就是说,我假设HttpContext 是您的控制器中的一个字段,并且您不是指HttpContext 类型。如果不是这种情况,那么这就是您的问题的原因。

标签: asp.net asp.net-core .net-core asp.net-core-mvc asp.net-core-2.0


【解决方案1】:

HttpContext 应该是对 Controller 中字段的引用,并且您不是在引用 HttpContext 类型。如果不是这种情况,那么这就是您的问题的原因,请更改您的代码以使用字段/变量而不是类型。

因此,如果字段名称为httpContext,则使用它,因为调用扩展方法是通过引用实例上的方法而不是类型来完成的,因为实例也作为扩展方法的第一个参数传入。

await httpContext.SignInAsync(IdentityConstants.ApplicationScheme);

【讨论】:

    【解决方案2】:
        AuthenticationHttpContextExtensions.SignOutAsync(HttpContext, "Cookies");
    
        AuthenticationHttpContextExtensions
    .SignOutAsync(HttpContext, CookieAuthenticationDefaults.AuthenticationScheme);
    

    在控制器中试试这个

    【讨论】:

      【解决方案3】:

      插入

      await HttpContext.SignInAsync(IdentityConstants.ApplicationScheme);
      

      应该使用

      await httpContext.SignInAsync(IdentityConstants.ApplicationScheme,ClaimsPrincipal.Current);
      

      或者可以使用

      await Microsoft.AspNetCore.Authentication.AuthenticationHttpContextExtensions.SignInAsync(IdentityConstants.ApplicationScheme,ClaimsPrincipal.Current);
      

      【讨论】:

        猜你喜欢
        • 2019-09-22
        • 1970-01-01
        • 2019-09-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-27
        相关资源
        最近更新 更多