【发布时间】:2018-03-22 04:27:20
【问题描述】:
我想从授权请求中检索 jwt 令牌的原始值。我知道这是所有声明的来源,但我有一个需要原始原始值的用例。有没有办法找回它?如果它取决于身份验证类型,我们使用 OpenIdConnect (scheme = Oidc)。
【问题讨论】:
标签: asp.net-core openid jwt
我想从授权请求中检索 jwt 令牌的原始值。我知道这是所有声明的来源,但我有一个需要原始原始值的用例。有没有办法找回它?如果它取决于身份验证类型,我们使用 OpenIdConnect (scheme = Oidc)。
【问题讨论】:
标签: asp.net-core openid jwt
根据您的设置,您可以简单地从授权标头中获取访问令牌。示例:
[Authorize(AuthenticationSchemes = "Bearer")]
[HttpGet("GetStuff")]
public async Task<IActionResult> GetStuff()
{
var access_token = HttpContext.Request.Headers["Authorization"];
}
在 Core 2.0 中,ycrumeyrolle 的答案中的 AuthenticationManager 类已被标记为过时。您可以替换这行代码:
var token = await AuthenticationHttpContextExtensions.GetTokenAsync(HttpContext, "<name_of_signin_scheme>", "access_token");
【讨论】:
原始是什么意思?令牌本身是原始的,只是令牌本身的 base64。如果你把令牌放在jwt.io 上,你总是可以解码它,这不是什么秘密。
如果您认为需要原始令牌是因为您需要它本身具有的某些值,那么最好的做法是将这些元素的副本添加到授权响应中,作为附加项。
【讨论】:
你可以试试这个:
// add JWT authentication (change to OIDC if you prefer)
app.UseJwtBearerAuthentication(new JwtBearerOptions
{
StoreToken = true
});
// then in your code...
var rawToken = await authenticationManager.GetTokenAsync("<name_of_signin_scheme>", "access_token");
缺点是令牌将存储在属性中,然后存储在身份验证 cookie(如果有)中。
否则,您可以通过 ReceivedToken 事件获取原始令牌。
GetTokenAsync() 方法可以在 Microsoft.AspNetCore.Authentication 的同名命名空间中找到。
【讨论】:
authenticationManager 对象的类型是什么? GetTokenAsync 是扩展方法吗?我在看Microsoft.AspNetCore.Http.Authentication.AuthenticationManager,没有看到那个方法。
Microsoft.AspNetCore.Authentication.AuthenticationTokenExtensions找到。让我试一试,如果可行,我会接受你的回答。
Microsoft.AspNet.Security,但我仍然没有Microsoft.AspNetCore 命名空间(更不用说它的任何子命名空间了)。
有一篇关于这个问题的简短博客文章:http://www.jerriepelser.com/blog/aspnetcore-jwt-saving-bearer-token-as-claim/
您可以将令牌保存在AuthenticationProperties 中(另请参阅@ycrumeyrolle 的答案)。或者您将令牌保存为OnTokenValidated 回调中的声明。这是在JwtBearerOptions 中设置的。有关所有详细信息,请参阅链接文章。
【讨论】: