验证Live.com(Microsoft帐户)JWT令牌

时间:2014-08-21 19:14:30

标签: c# security owin asp.net-web-api2 jwt

研究员,

我目前正在努力使用Web Api 2中的Microsoft帐户JWT令牌验证。 我已经找到了OWIN中间件(NuGet包Microsoft.Owin.Security.Jwt),这里是我的Startup.cs配置的代码:

    public void ConfigureAuth(IAppBuilder app)
    {
        var sha256 = new SHA256Managed();
        var secretBytes = System.Text.Encoding.UTF8.GetBytes(@"(My app client secret)" + "JWTSig");
        byte[] signingKey = sha256.ComputeHash(secretBytes);

        app.UseJwtBearerAuthentication(
            new JwtBearerAuthenticationOptions
            {
                AllowedAudiences = new[] { "(My API's domain )" },
                IssuerSecurityTokenProviders =
                    new[]
                            {
                                new SymmetricKeyIssuerSecurityTokenProvider(
                                    "urn:windows:liveid", signingKey)
                            }
            });
    }

我在这里找到了这个片段:

http://code.lawrab.com/2014/01/securing-webapi-with-live-id.html

使用Live SDK从我的Windows应用商店应用客户端发送JWT令牌。我正在发送身份验证令牌,而不是访问令牌,所以我确定它是JWT。使用像这样的在线调试器:http://jwt.io/我能够成功解码标题和放大器。有效负载部分,但我找不到验证签名的方法。发送具有该JWT的请求时,我的Web API的调试输出是:

Microsoft.Owin.Security.OAuth.OAuthBearerAuthenticationMiddleware Error: 0 : Authentication failed
System.IdentityModel.Tokens.SecurityTokenSignatureKeyNotFoundException: IDX10500: Signature validation failed. Unable to resolve SecurityKeyIdentifier: 'SecurityKeyIdentifier
    (
    IsReadOnly = False,
    Count = 1,
    Clause[0] = System.IdentityModel.Tokens.NamedKeySecurityKeyIdentifierClause
    )
', 
token: '{"alg":"HS256","kid":"0","typ":"JWT"}.{"ver":1,"iss":"urn:windows:liveid","exp":1408666611,"uid":"my Microsoft account uid","aud":"(My API's domain)","urn:microsoft:appuri":"ms-app://(client app store id)","urn:microsoft:appid":"(ID of the app from account.live.com/developers)"}
RawData: (the JWT token)'.
   w System.IdentityModel.Tokens.JwtSecurityTokenHandler.ValidateSignature(String token, TokenValidationParameters validationParameters)
   w System.IdentityModel.Tokens.JwtSecurityTokenHandler.ValidateToken(String securityToken, TokenValidationParameters validationParameters, SecurityToken& validatedToken)
   w Microsoft.Owin.Security.Jwt.JwtFormat.Unprotect(String protectedText)
   w Microsoft.Owin.Security.Infrastructure.AuthenticationTokenReceiveContext.DeserializeTicket(String protectedData)
   w Microsoft.Owin.Security.OAuth.OAuthBearerAuthenticationHandler.d__0.MoveNext()

对不起我的英文,任何更正都非常受欢迎。

1 个答案:

答案 0 :(得分:0)

我可以使用的最简单的方法之一就是从Source本身对其进行验证。

在您当前的情况下,您正在使用live.com,然后向live.com发送一个请求,并在标头中使用您的令牌,如果它是有效的标头,它将返回已知值(例如用户帐户信息)< / p>

选择这样的网址: https://outlook.live.com/ows/v1.0/OutlookOptions

并将标头中的令牌作为授权发送:承载TOKEN_VALUE

如果它返回了期望值,则它是一个有效的令牌,会话也正在工作