我正在尝试向我的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]
属性的方法都可以正常使用。
有没有办法 - 至少 - 调试并看看发生了什么?
答案 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调试快照:
答案 1 :(得分:0)
尝试在Startup.cs文件中启用CORS
public void ConfigureAuth(IAppBuilder app) {
app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
// Rest of code
}