验证ASP.NET Web API

时间:2017-02-01 07:44:24

标签: c# asp.net asp.net-web-api oauth jwt

我有一个移动客户端(应用),让用户通过谷歌进行身份验证。因此,客户端从谷歌接收访问令牌和一些信息(姓名,电子邮件等)。工作正常!

我还创建了一个移动应用程序应该与之通信的ASP.NET Web API。在客户端,我将令牌添加到HttpClient: client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(“Bearer”,“pretty_long_access_token_separated_by_two_dots”);

问题1:我正在尝试“解码”此网站上的访问令牌(以确保其正常):https://jwt.io/ 标题和有效负载是正确的,但它似乎是一个“无效的签名”(在底部说)。我应该担心吗?

在服务器端,我将其添加到Startup类的Configuration方法中:

app.UseJwtBearerAuthentication( new JwtBearerAuthenticationOptions
{
    AuthenticationMode = AuthenticationMode.Active,
    AllowedAudiences = new List<string> {"my_client_id"},
    IssuerSecurityTokenProviders = new IIssuerSecurityTokenProvider[]
    {
        new SymmetricKeyIssuerSecurityTokenProvider(@"https://accounts.google.com/", "my_client_secret")
    },
});

在我的服务器端,我唯一想要使用令牌的是确保只有我应用中经过验证的用户才能访问我的API控制器。

问题2:UseJwtBearerAuthentication对我来说是对的,还是我的方向错误?

我的问题是,在尝试访问我的WEB API控制器时,我经常获得401,未经授权。

如果我走在正确的轨道上,我可以尝试解释有关服务器端设置的更多信息......

任何头盔都会非常感激!

1 个答案:

答案 0 :(得分:0)

如果您使用的是JWT令牌,则需要JWT代替Bearer

client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("JWT", "pretty_long_access_token_separated_by_two_dots");

签名用于将令牌验证为可信令牌,因此只有身份验证服务器才需要。如果Google是您的身份验证服务器,那么您应该可以从服务器调用API端点来验证令牌是否有效。

如果您的服务器正在发出JWT令牌,那么您需要通过使用首先用于创建签名的密码解码签名来检查令牌是否有效

如果Google发布JWT并且您希望您的服务器能够自我验证它,那么您需要使用其他加密类型,例如RS256,这将允许您使用Google发布的公钥验证签名(I不知道他们是否提供这种方法)

https://jwt.io/无法验证您的签名的原因是因为它是使用密码签名的。如果您有此密码,则可以将其粘贴到右下方的文本框中。如果密钥是正确的,并且令牌尚未过期,则它将显示为有效的JWT令牌。