[英]Fetch access token from authorization header without bearer prefix
我正在为我的 .NET 核心项目使用Microsoft.AspNetCore.Authentication.JwtBearer和System.IdentityModel.Tokens.Jwt包。
有一些受[Authorize]
注释保护的 controller 端点必须从请求中获取访问令牌。 目前我正在以这种方式在我的 controller 方法中获取访问令牌:
string accessTokenWithBearerPrefix = Request.Headers[HeaderNames.Authorization];
string accessTokenWithoutBearerPrefix = accessTokenWithBearerPrefix.Substring("Bearer ".Length);
我想知道是否有更好的“即用型”解决方案,因为使用上面的代码在从不记名令牌中获取 substring 时仍可能导致错误。
这是一种无需将 go 放入标题字典的巧妙方法即可获得 header。 这也将让框架解析令牌,这就是我相信您正在寻找的:
[HttpGet, Route("someEndpoint")]
public IActionResult SomeEndpoint([FromHeader] string authorization)
{
if(AuthenticationHeaderValue.TryParse(authorization, out var headerValue))
{
// we have a valid AuthenticationHeaderValue that has the following details:
var scheme = headerValue.Scheme;
var parameter = headerValue.Parameter;
// scheme will be "Bearer"
// parmameter will be the token itself.
}
return Ok();
}
您也可以用老式的方式获取 header:
[HttpGet, Route("someEndpoint")]
public IActionResult SomeEndpoint()
{
var authorization = Request.Headers[HeaderNames.Authorization];
if (AuthenticationHeaderValue.TryParse(authorization, out var headerValue))
{
// we have a valid AuthenticationHeaderValue that has the following details:
var scheme = headerValue.Scheme;
var parameter = headerValue.Parameter;
// scheme will be "Bearer"
// parmameter will be the token itself.
}
return Ok();
}
好的是AuthenticationHeaderValue.TryParse
将涵盖奇怪的情况,例如方案和令牌之间是否有多个空格,或者方案之前有空格,或者令牌之后有空格......并为您修剪它。
现在,这些情况永远不会发生,但是......它们可能会,并且accessTokenWithBearerPrefix.Substring("Bearer ".Length);
的执行会失败。 这就是为什么我相信您想要一种更具体的方式来解析令牌。
您可以将Startup.cs中的 SaveToken 设置为true
。
services.AddAuthentication()
.AddJwtBearer(options =>
{
// your other config
options.SaveToken = true;
});
并使用GetTokenAsync
方法从HttpContext
获取访问令牌。
using Microsoft.AspNetCore.Authentication;
public class SampleController : Controller
{
public void Index()
{
var accessToken = HttpContext.GetTokenAsync("access_token");
}
}
您可以使用以下代码获取安全令牌。
var stream ="[encoded jwt]";
var handler = new JwtSecurityTokenHandler();
var jsonToken = handler.ReadToken(stream);
var tokenS = handler.ReadToken(stream) as JwtSecurityToken;
另外,如果你想忽略 JWT Bearer token signature ,你可以参考下面的代码:
public TokenValidationParameters CreateTokenValidationParameters()
{
var result = new TokenValidationParameters
{
ValidateIssuer = false,
ValidIssuer = ValidIssuer,
ValidateAudience = false,
ValidAudience = ValidAudience,
ValidateIssuerSigningKey = false,
//IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(SecretKey)),
//comment this and add this line to fool the validation logic
SignatureValidator = delegate(string token, TokenValidationParameters parameters)
{
var jwt = new JwtSecurityToken(token);
return jwt;
},
RequireExpirationTime = true,
ValidateLifetime = true,
ClockSkew = TimeSpan.Zero,
};
result.RequireSignedTokens = false;
return result;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.