我有以下JWT令牌
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOi8vbG9jYWxob3N0IiwiYXVkIjoiRDFDOTBCRUUtOEM1NC00RDZCLThENDYtOTU5NkJGQjRGMjhCIiwic3ViIjoiMTAwMCJ9.GdVBv2LPqKi1NmwPnnaGq6jz5WMLNkQOG9WttoH6Nfw=
,秘密是
BE7B9DD1-6197-4684-A232-5D680812ADC3
如果我们对秘密进行基本编码,我们会得到以下内容
QkU3QjlERDEtNjE5Ny00Njg0LUEyMzItNUQ2ODA4MTJBREMz
通过jwt.io
中的签名验证标题被解码为
{
"typ": "JWT",
"alg": "HS256"
}
和有效载荷
{
"iss": "http://localhost",
"aud": "D1C90BEE-8C54-4D6B-8D46-9596BFB4F28B",
"sub": "1000"
}
一切都很好。我从以下文章中了解到
https://auth0.com/docs/server-apis/webapi-owin和
http://bitoftech.net/2014/10/27/json-web-token-asp-net-web-api-2-jwt-owin-authorization-server/
所以我在Startup.ConfigureOAuth()中的代码只是他们的副本(不记得我先看到的那个):
var issuer = "http://localhost";
var audience = "D1C90BEE-8C54-4D6B-8D46-9596BFB4F28B";
var secret = TextEncodings.Base64Url.Decode("BE7B9DD1-6197-4684-A232-5D680812ADC3");
// Api controllers with an [Authorize] attribute will be validated with JWT
app.UseJwtBearerAuthentication(
new JwtBearerAuthenticationOptions
{
AuthenticationMode = AuthenticationMode.Active,
AllowedAudiences = new[] { audience },
IssuerSecurityTokenProviders = new IIssuerSecurityTokenProvider[]
{
new SymmetricKeyIssuerSecurityTokenProvider(issuer, secret)
},
Provider = new OAuthBearerAuthenticationProvider
{
OnValidateIdentity = context =>
{
context.Ticket.Identity.AddClaim(new System.Security.Claims.Claim("newCustomClaim", "newValue"));
return Task.FromResult<object>(null);
}
}
});
我厌倦了提供者和没有提供者。但我得到的只是401和以下
{
"Message": "Authorization has been denied for this request."
}
我知道我的JWT是正确的,因为jwt.io可以很好地解码它。有人可以发现我的错误,或者我是否应该采用不同的方式。
答案 0 :(得分:1)
您已复制了从配置中提取base64url编码机密的示例中的代码。但在你的情况下,秘密是纯文本。所以只需使用:
var secret = "BE7B9DD1-6197-4684-A232-5D680812ADC3";
jwt.io显示用于签署您提供的JWT的秘密实际上是base64编码的变体QkU3QjlERDEtNjE5Ny00Njg0LUEyMzItNUQ2ODA4MTJBREMz
,它应该首先被base64解码。