通过使用UseJwtBearerAuthentication,jwt.io验证的JWT在C#中失败

时间:2015-01-24 05:02:26

标签: oauth jwt

我有以下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可以很好地解码它。有人可以发现我的错误,或者我是否应该采用不同的方式。

1 个答案:

答案 0 :(得分:1)

您已复制了从配置中提取base64url编码机密的示例中的代码。但在你的情况下,秘密是纯文本。所以只需使用:

var secret = "BE7B9DD1-6197-4684-A232-5D680812ADC3";

jwt.io显示用于签署您提供的JWT的秘密实际上是base64编码的变体QkU3QjlERDEtNjE5Ny00Njg0LUEyMzItNUQ2ODA4MTJBREMz,它应该首先被base64解码。