ASP.Net Core - 使用 WebAPI 和 MVC 前端的 JWT 身份验证不起作用

Posted

技术标签:

【中文标题】ASP.Net Core - 使用 WebAPI 和 MVC 前端的 JWT 身份验证不起作用【英文标题】:ASP.Net Core - JWT Authentication with WebAPI and MVC Frontend not working 【发布时间】:2018-11-20 22:24:20 【问题描述】:

项目由两部分组成:

ASP.Net Core API ASP.Net Core MVC 前端

基本上,我想做的是通过 JWT 进行身份验证。因此,API 发出 JWT,MVC 前端将 Identity 与 JWT 中声明的声明和角色一起使用。

API 中的 Startup.cs:

private const string SecretKey = "my_Secret_Key";
private readonly SymmetricSecurityKey _signingKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(SecretKey));

            #region JWT Auth


        // jwt wire up
        // Get options from app settings
        var jwtAppSettingOptions = Configuration.GetSection(nameof(JwtIssuerOptions));

        // Configure JwtIssuerOptions
        services.Configure<JwtIssuerOptions>(options =>
        
            options.Issuer = jwtAppSettingOptions[nameof(JwtIssuerOptions.Issuer)];
            options.Audience = jwtAppSettingOptions[nameof(JwtIssuerOptions.Audience)];
            options.SigningCredentials = new SigningCredentials(_signingKey, SecurityAlgorithms.HmacSha256);
        );

        var tokenValidationParameters = new TokenValidationParameters
        
            ValidateIssuer = true,
            ValidIssuer = jwtAppSettingOptions[nameof(JwtIssuerOptions.Issuer)],

            ValidateAudience = true,
            ValidAudience = jwtAppSettingOptions[nameof(JwtIssuerOptions.Audience)],

            ValidateIssuerSigningKey = true,
            IssuerSigningKey = _signingKey,


            RequireExpirationTime = false,
            ValidateLifetime = true,
            ClockSkew = TimeSpan.Zero
        ;

        services.AddAuthentication(options =>
        
            options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
            options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;

        ).AddJwtBearer(configureOptions =>
        
            configureOptions.ClaimsIssuer = jwtAppSettingOptions[nameof(JwtIssuerOptions.Issuer)];
            configureOptions.TokenValidationParameters = tokenValidationParameters;
            configureOptions.SaveToken = true;
        );

        // api user claim policy
        services.AddAuthorization(options =>
        
            options.AddPolicy(Constants.Policies.ApiAccess, policy => policy.RequireClaim(Constants.JwtClaimIdentifiers.Rol, Constants.JwtClaims.ApiAccess));
        );

        #endregion

JWT 生成:

        public async Task<string> GenerateEncodedToken(string userName)
    

        User user = _userManager.GetUserByUserName(userName);
        List<string> userRoles = _userManager.GetRoles(user.Guid);

        var claimsToEncode = new[]
     
             new Claim(JwtRegisteredClaimNames.Sub, userName),
             new Claim("web", user.WebId),
             new Claim(JwtRegisteredClaimNames.Jti, await _jwtOptions.JtiGenerator()),
             new Claim(JwtRegisteredClaimNames.Iat, ToUnixEpochDate(_jwtOptions.IssuedAt).ToString(), ClaimValueTypes.Integer64),
             new Claim(Constants.JwtClaimIdentifiers.Rol,Constants.JwtClaims.ApiAccess),
     ;


        // Create the JWT security token and encode it.
        var jwt = new JwtSecurityToken(
            issuer: _jwtOptions.Issuer,
            audience: _jwtOptions.Audience,
            claims: claimsToEncode,
            notBefore: _jwtOptions.NotBefore,
            expires: _jwtOptions.Expiration,
            signingCredentials: _jwtOptions.SigningCredentials);


        jwt.Payload.Add("roles", userRoles.ToArray());

        var encodedJwt = new JwtSecurityTokenHandler().WriteToken(jwt);



        return encodedJwt;
    

授权在 API 中就像一个魅力。

现在我想做以下事情: 在前端实现相同的,以便: MVC Frontend 接收 Credentials,将其发送到 API,获取 Token,并使用 Token 中的 Claims 和 Roles 进行授权。

我尝试了几件事,但到目前为止都没有奏效。 我必须在前端的 Startup.cs 中插入什么,以便身份检查不是针对密钥(不允许前端拥有)而是针对公钥?还是我必须在 API 中实现一个端点来远程验证 JWT?

【问题讨论】:

【参考方案1】:

当您在 web 客户端中获取令牌时,您可以将其存储在会话对象中,并在您从 webapi 请求某些内容时发送它

【讨论】:

这更适合作为评论而不是答案。 当您在 Web 客户端中获取令牌时,您可以将其存储在会话对象中,并在您从 webapi 请求某些内容时发送它

以上是关于ASP.Net Core - 使用 WebAPI 和 MVC 前端的 JWT 身份验证不起作用的主要内容,如果未能解决你的问题,请参考以下文章

使用 JWT 令牌的 ASP.NET Core 网站到 WebApi 身份验证

Asp.Net Core WebAPI CORS 不工作

ASP.NET Core 2.2 WebAPI 405 方法不允许

ASP.NET Core 5.0 WebAPI 中的多种身份验证方案

SPA (Aurelia) + ASP.NET Core WebAPI + Google 身份验证

获取 ASP .Net Core WebAPI 中的所有身份角色