.NET核心授权 - JWT承载上的常量403

时间:2018-04-26 09:44:28

标签: c# asp.net-web-api authorization jwt asp.net-core-2.0

我正在尝试向我的API添加带有JWT令牌的API的请求,但是,没有任何教程,博客文章和文档有助于避免常见的403 - Unauthorized错误。

这是-skimmed-当前配置:

生成令牌的类:TokenManagement.cs

// Add the claims to the token
var claims = new[] {
    new Claim(JwtRegisteredClaimNames.Sub, credentials.Username),
    new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
    new Claim("claimName", "claimValue")
};

配置服务:Startup.cs - ConfigureServices()

services.Configure<GzipCompressionProviderOptions>(options => options.Level = System.IO.Compression.CompressionLevel.Optimal);
services.AddResponseCompression();

services.AddAuthentication()
    .AddJwtBearer(config => {
        config.RequireHttpsMetadata = false;
        config.SaveToken = true;
        config.TokenValidationParameters = new TokenValidationParameters()
        {
            ValidIssuer = "Issuer",
            ValidAudience = "Audience",
            IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(symmetricKey))
        };
});

services.AddAuthorization(options => {
    options.AddPolicy("myCustomPolicy", policy => {
        policy.AddAuthenticationSchemes(JwtBearerDefaults.AuthenticationScheme);
        policy.RequireClaim("claimName", "claimValue");
    });
});

services.AddMvc();

常规配置:Startup.cs - Configure()

app.UseAuthentication();

app.Use(async (context, next) => {
    await next();

    if (context.Response.StatusCode == 404 &&
        !Path.HasExtension(context.Request.Path.Value)) {
        context.Request.Path = "/index.html";
        await next();
    }
});

app.UseMvc();

app.UseResponseCompression();

app.UseDefaultFiles();
app.UseStaticFiles();

应授权的控制器:ActionsController.cs

[Authorize(Policy = "myCustomPolicy")]
[Route("api/[controller]")]
public class ActionsController : Controller

我发送给服务器的任何请求(带有正确声明的JWT令牌)都返回403

任何具有[AllowAnonymous]属性的方法都可以正常使用。

有没有办法 - 至少 - 调试并看看发生了什么?

2 个答案:

答案 0 :(得分:1)

我发现某些声明类型已从我的身份服务器配置更改为不同的值。

例如,在我的Identity Server中,我正在使用角色声明类型:

  UserClaims = new []
  {
     JwtClaimTypes.Role , user.role // "JwtClaimTypes.Role" yield "role"
  };

但是当我调试Web api时,角色声明类型已更改为(请参阅下面的监视部分的快照):

 "http://schemas.microsoft.com/ws/2008/06/identity/claims/role"

解决方案:

要解决此问题(这是您期望的行为吗?),您需要检查您的索赔类型 值正在计划在Web api中使用,并在保单中使用正确的声明类型值。

 services.AddAuthorization(options =>
 {
    options.AddPolicy("RequireAdmin", policy =>
    {
        
       //policy.RequireClaim(IdentityModel.JwtClaimTypes.Role, "Admin"); // this doesn't work
       policy.RequireClaim(ClaimTypes.Role, "Admin"); //  this work
    });
  });

我的Web API调试快照:

screen of policyAssertion

答案 1 :(得分:0)

尝试在Startup.cs文件中启用CORS

public void ConfigureAuth(IAppBuilder app) {
    app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
    // Rest of code
}