【问题标题】:JWT token isn't validated even if it's correct using Microsoft.Azure.Mobile SDK即使使用 Microsoft.Azure.Mobile SDK 正确,也不会验证 JWT 令牌
【发布时间】:2017-12-17 02:17:59
【问题描述】:

我正在使用 Microsoft.Azure.Mobile SDK 来实现服务器代码。

OWIN启动代码如下:

public void ConfigureAuth(IAppBuilder app)
{
    HttpConfiguration config = new HttpConfiguration();
    new MobileAppConfiguration().ApplyTo(config);
    app.UseAppServiceAuthentication(new AppServiceAuthenticationOptions
    {
        SigningKey = ConfigurationManager.AppSettings["SigningKey"],
        ValidAudiences = new[] { ConfigurationManager.AppSettings["ValidAudience"] },
        ValidIssuers = new[] { ConfigurationManager.AppSettings["ValidIssuer"] },
        TokenHandler = config.GetAppServiceTokenHandler()
    });
    app.UseWebApi(config);
}

令牌生成代码:

Claim[] claims = new Claim[]
{
    new Claim("sub", "SampleSubject"),
    new Claim("Id", Convert.ToString(Users[0].user_id)),
    new Claim("name", Users[0].name),
    new Claim("surname", Users[0].surname),
    new Claim(ClaimTypes.Role, "user")
};
var token = AppServiceLoginHandler.CreateToken(claims, ConfigurationManager.AppSettings["SigningKey"], ConfigurationManager.AppSettings["ValidAudience"], ConfigurationManager.AppSettings["ValidIssuer"], TimeSpan.FromDays(30));
return token.RawData;

一个示例 JWT 令牌是 eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJHcnViZXJBUEkiLCJJZCI6IjMyODkwIiwibmFtZSI6IkRhdmlkZSIsInN1cm5hbWUiOiJCb25ldHRhIiwicm9sZSI6InVzZXIiLCJ2ZXIiOiIzIiwiaXNzIjoiaHR0cHM6Ly9sb2NhbGhvc3Q6MjM1MzEvIiwiYXVkIjoiaHR0cHM6Ly9sb2NhbGhvc3Q6MjM1MzIvIiwiZXhwIjoxNTAyNDYyNDQzLCJuYmYiOjE0OTk4NzA0NDN9.b5VhWzvkaEumutPZpLzImcAy4NotXCSgUIqLltVUQWI

令牌在下面的屏幕截图中是有效的

对于下面的代码,

 [Authorize]
    public IEnumerable<string> Get()
    {
        return new string[] { "value1", "value2" };
    }

    // GET api/values/5 
    public string Get(int id)
    {

        try
        {
            ClaimsPrincipal claims;
            AppServiceTokenHandler s = new AppServiceTokenHandler(new HttpConfiguration());
            s.TryValidateLoginToken(Request.Headers.Authorization.Parameter, ConfigurationManager.AppSettings["SigningKey"], new[] { ConfigurationManager.AppSettings["ValidAudience"] }, new[] { ConfigurationManager.AppSettings["ValidIssuer"] }, out claims);

            AppServiceTokenHandler.ValidateToken(Request.Headers.Authorization.Parameter, ConfigurationManager.AppSettings["SigningKey"], ConfigurationManager.AppSettings["ValidAudience"], ConfigurationManager.AppSettings["ValidIssuer"]);
        }
        catch (Exception ex)
        {

            throw;
        }

        return "value";
    }

'/Get' 请求失败并出现 HTTP 401。 但是对于相同的 JWT 令牌“Get/5”返回 HTTP 200(手动验证令牌)。

问题是,当我使用Authorize属性时,api返回401。

【问题讨论】:

    标签: asp.net-mvc azure asp.net-web-api owin azure-mobile-services


    【解决方案1】:

    根据你的描述,我这边检查了这个问题。

    访问受保护的 Web API

    总而言之,您可以参考上面的屏幕截图并检查您的 api 端点。此外,您可以参考AppServiceTokenHandler.csHmacSigningCredentials.cs 来实现您的自定义TokenHandler 来解决此问题。此外,你可以参考阿德里安霍尔关于Custom Authentication的书 .

    【讨论】:

    • 是的,这解决了问题。我一直将令牌作为授权标头而不是“x-zumo-auth”
    猜你喜欢
    • 1970-01-01
    • 2017-05-08
    • 2017-05-14
    • 2018-09-30
    • 2016-09-09
    • 2015-10-16
    • 2019-09-09
    • 2018-11-25
    • 2019-06-23
    相关资源
    最近更新 更多