IsAuthenticated 在自定义授权属性(.NET Core 2.2 和 JSON Web 令牌)中始终为 false

Posted

技术标签:

【中文标题】IsAuthenticated 在自定义授权属性(.NET Core 2.2 和 JSON Web 令牌)中始终为 false【英文标题】:IsAuthenticated is always false in Custom Authorization Attribute (.NET Core 2.2 and JSON Web Token) 【发布时间】:2020-05-04 06:23:26 【问题描述】:

我正在尝试在 .net core 2.2 中使用 JSON Web Token JWT 构建我自己的自定义授权属性。

我正在使用 Postman 调用授权 API,我在这里遇到了两个问题:

    发送的JWT 中的声明未收到 IsAuthenticated 属性在 User.Identity.IsAuthenticated 中始终为 false。

请注意,JWT 的部分工作正常,JWT 正在按照我想要的正确Claims 创建,我已经在https://jwt.io 上进行了检查。

至于我的Startup.cs,我正在使用app.UseAuthentication()

这是我将JWTAuthentication 添加到services 的方法:

        services.AddAuthentication(x =>
        
            x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
            x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
        )
        .AddJwtBearer(x=>
        
            x.RequireHttpsMetadata = false;
            x.SaveToken = true;
            x.TokenValidationParameters = new TokenValidationParameters
            
                ValidateIssuerSigningKey = true,
                IssuerSigningKey = new SymmetricSecurityKey(key),
                ValidateIssuer = true,
                ValidateAudience = false
            ;
        );
        services.AddIdentity<ApplicationUser, IdentityRole>()
            .AddEntityFrameworkStores<AppIdentityDbContext>()
            .AddDefaultTokenProviders();

这是MyCustomAuthorizationAttribute.cs的sn-p

    public string Permissions  get; set;  //Permission string to get from controller

    public void OnAuthorization(AuthorizationFilterContext context)
    
        //Validate if any permissions are passed when using attribute at controller or action level
        if (string.IsNullOrEmpty(Permissions))
        
            //Validation cannot take place without any permissions so returning unauthorized
            context.Result = new UnauthorizedResult();
            return;
        


        //The below line can be used if you are reading permissions from token
        var permissionsFromToken = context.HttpContext.User.Claims.Where(x => x.Type == "Permissions").Select(x => x.Value).ToList();

        var requiredPermissions = Permissions.Split(','); //Multiple permissiosn can be received from controller, delimiter "," is used to get individual values
        foreach (var x in requiredPermissions)
        
            if (permissionsFromToken.Contains(x))
                return; //User Authorized. Wihtout setting any result value and just returning is sufficent for authorizing user
        

        context.Result = new UnauthorizedResult();
        return;
    

注意:我知道这个问题以前被问过很多次,但我尝试了其中的大部分,但对我没有任何帮助。

【问题讨论】:

您是如何在MyCustomAuthorizationAttribute 中获得Permissions 的?请注意,您需要设置ValidateIssuerValidateAudience。并确保您已添加类型为@987654341 的声明@.参考:***.com/a/58163087/11398810 是的,您提到的所有内容都已经存在,但令人惊讶的是,问题只是在Startup.cs 中订购中间件,并且权限是根据登录的用户从数据库中获取的。 【参考方案1】:

我发现将中间件服务放入Startup.cs 的顺序很重要。正如我们在上面的代码 sn-p 中看到的那样。在使用 AddAuthentication()AddJwtBearer() 之后,我正在使用 AddIdentity() 中间件,这以某种方式删除了 JWT 身份验证提供程序。

解决方案只是将AddIdentity() 中间件及其所有子方法放在AddAuthentication()AddJWTBearer() 中间件之前。

【讨论】:

以上是关于IsAuthenticated 在自定义授权属性(.NET Core 2.2 和 JSON Web 令牌)中始终为 false的主要内容,如果未能解决你的问题,请参考以下文章

如何在自定义授权方 AWS lambda 函数中访问 http 标头

在自定义授权 MVC4 Web Api 中访问 post 或 get 参数

验证操作过滤器或授权过滤器的用户权限?

使用依赖属性在自定义类中设置属性

在自定义属性更改时重绘自定义 CALayer 子类

如何在自定义 HttpMessageHandler 中设置属性?