.NET Core 2 Web API JWT 令牌无法识别

Posted

技术标签:

【中文标题】.NET Core 2 Web API JWT 令牌无法识别【英文标题】:.NET Core 2 Web API JWT token not recognized 【发布时间】:2018-07-18 09:37:48 【问题描述】:

我关注this tutorial 在我的 Web API 应用程序中配置 JWT 授权。令牌生成和分发工作正常,但是当我使用令牌向服务器发送请求时,它不会填充身份,因此如果需要授权,它会失败。

我已经使用 reactjs 前端和 Postman 进行了测试。两者最终都没有返回任何内容(没有授权装饰器 - User.Identity.isAuthorized 为假),或者装饰器返回 404。我已确认令牌已正确发送。

我也在使用 Identity,如果这很重要的话。

ConfigureServices 方法

    public void ConfigureServices(IServiceCollection services)
    
        ...

        services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
        .AddJwtBearer(options =>
        
            options.TokenValidationParameters = new TokenValidationParameters
            
                ValidateIssuer = true,
                ValidateAudience = true,
                ValidateLifetime = true,
                ValidateIssuerSigningKey = true,
                ValidIssuer = Configuration["Jwt:Issuer"],
                ValidAudience = Configuration["Jwt:Audience"],
                IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Jwt:Key"]))
            ;
        );
   

配置方法

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, IServiceProvider serviceProvider)
    
        if (env.IsDevelopment())
        
            app.UseDeveloperExceptionPage();
        

        app.UseAuthentication();

        app.UseCors("SiteCorsPolicy");

        app.UseMvc();

        ...
    

构建令牌的功能

    private string BuildToken(AuthViewModel user)
    
        var claims = new[]
        
            new Claim(JwtRegisteredClaimNames.Sub, user.Username),
            new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())
        ;

        var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_config["Jwt:Key"]));
        var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);

        var token = new JwtSecurityToken
        (
            _config["Jwt:Issuer"],
            _config["Jwt:Audience"],
            //claims,
            expires: DateTime.Now.AddMinutes(30),
            signingCredentials: creds
        );

        return new JwtSecurityTokenHandler().WriteToken(token);
    

摘自 appsettings.json

"Jwt": 
    "Key": "<secret stuff>",
    "Issuer": "http://localhost:53530/",
    "Audience": "http://localhost:8080/"
 

我正在尝试调用但失败的测试函数

    [HttpGet("currentuser"), Authorize]
    public async Task<ApplicationUser> GetCurrentUser()
    
        var username = User.Identity.Name;

        return await _context.ApplicationUsers.SingleOrDefaultAsync(u => u.UserName == username);
    

【问题讨论】:

希望我的回答能帮助到***.com/a/52822924/5374333 【参考方案1】:

我想通了。我必须添加一个新的授权策略。

services.AddAuthorization(auth =>

    auth.AddPolicy("Bearer", new AuthorizationPolicyBuilder()
        .AddAuthenticationSchemes(JwtBearerDefaults.AuthenticationScheme)
        .RequireAuthenticatedUser().Build());
);

然后我用

装饰了控制器
[Authorize("Bearer"]

我已经搞砸了几天,尝试了不同的教程,所以我知道这在没有政策的情况下是有效的。不知道为什么我这次需要它,或者为什么它不是教程的一部分。

如果有人知道我一开始搞砸了什么,我会全神贯注。

【讨论】:

【参考方案2】:

我遇到了同样的问题(.net core 2.1),并且很高兴使用您的回答 @atfergs 使其正常工作。

在摆弄了整个设置之后,我发现不需要新的授权策略。

用控制器来装饰就足够了

[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]

考虑以下设置

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

现在

    User?.Identity?.IsAuthenticated

是真的:)

干杯!

【讨论】:

以上是关于.NET Core 2 Web API JWT 令牌无法识别的主要内容,如果未能解决你的问题,请参考以下文章

.NET Core 2 Web API JWT 令牌无法识别

asp.net core 2.0 web api基于JWT自定义策略授权

text 使用ASP.NET Core 2 Web API,Angular 5,.NET核心身份和Facebook登录进行JWT身份验证

.Net Core 2.0 Web API 使用 Identity / JWT 并让用户管理器使用 DI

将 JWT Bearer Authentication Web API 与 Asp.Net Core 2.0 结合使用的问题

在 .NET Core 2 Web Api 中验证 JWT 后获取用户数据的最佳做法是啥?