C# 正在验证我的ASP.NET Web API中的访问令牌
我有一个移动客户端(app),让用户通过谷歌认证。因此,客户端从google收到一个访问令牌和一些信息(姓名、电子邮件等)。很好 我还创建了一个ASP.NETWebAPI,移动应用程序应该与之通信。在客户端,我使用以下方式将令牌添加到HttpClient: client.DefaultRequestHeaders.Authorization=新的AuthenticationHeaderValue(“承载”、“相当长的访问权”和由两个点分隔的令牌”) 问题1:我正在尝试“解码”此站点上的访问令牌(以确保它正常): 标题和有效负载都是正确的,但它似乎是一个“无效签名”(在底部表示)。我应该为此担心吗?C# 正在验证我的ASP.NET Web API中的访问令牌,c#,asp.net,asp.net-web-api,oauth,jwt,C#,Asp.net,Asp.net Web Api,Oauth,Jwt,我有一个移动客户端(app),让用户通过谷歌认证。因此,客户端从google收到一个访问令牌和一些信息(姓名、电子邮件等)。很好 我还创建了一个ASP.NETWebAPI,移动应用程序应该与之通信。在客户端,我使用以下方式将令牌添加到HttpClient: client.DefaultRequestHeaders.Authorization=新的AuthenticationHeaderValue(“承载”、“相当长的访问权”和由两个点分隔的令牌”) 问题1:我正在尝试“解码”此站点上的访问令牌(
在服务器端,我在Startup类的配置方法中添加了以下内容:
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")
},
});
app.useJWTBeareAuthentication(新的JWTBeareAuthenticationOptions
{
AuthenticationMode=AuthenticationMode.Active,
AllowedAudions=新列表{“我的客户id”},
IssuerSecurityTokenProviders=新的IIssuerSecurityTokenProvider[]
{
新的SymmetriceIsuerSecurityTokenProvider(@)https://accounts.google.com/“,“我的客户的秘密”)
},
});
在我的服务器端,我想对令牌做的唯一一件事就是确保只有来自我的应用程序的经过验证的用户才能访问我的API控制器
问题2:UseJWTBearAuthentication对我来说是正确的,还是我走错了方向?
我的问题是,当我试图访问我的WEB API控制器时,我经常得到401,未经授权
如果我在正确的轨道上,我可以尝试解释更多关于服务器端设置
任何帮助都将不胜感激 如果您使用的是JWT令牌,那么您将需要
JWT
而不是Bearer
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("JWT", "pretty_long_access_token_separated_by_two_dots");
签名用于验证令牌的真实性,因此只有身份验证服务器才需要签名。如果Google是您的身份验证服务器,那么应该有一个API端点,您可以从服务器调用该端点来验证令牌是否有效
如果您的服务器正在发布JWT令牌,那么您将需要通过使用最初用于创建该令牌的密钥对签名进行解码来检查该令牌是否有效
如果Google正在发布JWT,并且您希望您的服务器能够对其进行自我验证,那么您需要使用另一种加密类型,如RS256,这将允许您使用Google发布的公钥验证签名(我不知道他们是否提供此方法)
无法验证您的签名的原因是它是使用密码签名的。如果你有这个密码,那么你可以将它粘贴到右下角的文本框中。如果密码正确,且令牌未过期,则它将显示为有效的JWT令牌。如果您使用的是JWT令牌,则您将需要
JWT
而不是承载者
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("JWT", "pretty_long_access_token_separated_by_two_dots");
签名用于验证令牌的真实性,因此只有身份验证服务器才需要签名。如果Google是您的身份验证服务器,那么应该有一个API端点,您可以从服务器调用该端点来验证令牌是否有效
如果您的服务器正在发布JWT令牌,那么您将需要通过使用最初用于创建该令牌的密钥对签名进行解码来检查该令牌是否有效
如果Google正在发布JWT,并且您希望您的服务器能够对其进行自我验证,那么您需要使用另一种加密类型,如RS256,这将允许您使用Google发布的公钥验证签名(我不知道他们是否提供此方法)
无法验证您的签名的原因是它是使用密码签名的。如果你有这个密码,那么你可以将它粘贴到右下角的文本框中。如果秘密是正确的,并且令牌尚未过期,它将显示为有效的JWT令牌。请澄清,您是在发布JWT还是谷歌?请澄清,您是在发布JWT还是谷歌?谢谢您的回答!是的,谷歌是我的认证服务器。我不经营自己的公司。所以,在我的服务器端(在启动>配置中),我不应该使用app.UseJwtBearerAuthentication(…)?或在服务器端,我应该在哪里执行对Google API的验证调用?关于和测量自定义授权och身份验证属性?@Brosten-我不熟悉您正在使用的google auth,也许您可以将我链接到API或其他东西?谢谢您的回答!是的,谷歌是我的认证服务器。我不经营自己的公司。所以,在我的服务器端(在启动>配置中),我不应该使用app.UseJwtBearerAuthentication(…)?或在服务器端,我应该在哪里执行对Google API的验证调用?关于和测量自定义授权och身份验证属性?@Brosten-我不熟悉您使用的google auth,也许您可以将我链接到API或其他什么?