【发布时间】:2018-07-19 01:36:57
【问题描述】:
我在 ASP.NET Core 2 Web 应用程序中使用 JWT 令牌
如果 JWT 令牌失败,我仍然希望调用控制器方法,但 ASP.NET 标识 User 对象将为空。目前,如果身份验证失败,控制器方法将不会被输入,因此我无法在方法内部应用逻辑来处理我想作为访客处理而不是阻止他们的未经身份验证的用户。
我的代码:
Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication()
.AddJwtBearer(cfg =>
{
cfg.TokenValidationParameters = new TokenValidationParameters()
{
ValidIssuer = _config["Tokens:Issuer"],
ValidAudience = _config["Tokens:Audience"],
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_config["Tokens:Key"]))
};
});
当用户登录时
private IActionResult CreateToken(ApplicationUser user, IList<string> roles)
{
var claims = new List<Claim>
{
new Claim(JwtRegisteredClaimNames.Sub, user.Id.ToString()),
new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
new Claim(JwtRegisteredClaimNames.UniqueName, user.UserName)
};
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_config["Tokens:Key"]));
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
var token = new JwtSecurityToken(
_config["Tokens:Issuer"],
_config["Tokens:Audience"],
claims.ToArray(),
expires: DateTime.Now.AddMinutes(60),
signingCredentials: creds);
var results = new
{
token = new JwtSecurityTokenHandler().WriteToken(token),
expiration = token.ValidTo,
};
return Created("", results);
我确保在经过身份验证后,各种 API 调用都会传递 JWT 令牌。
在我的控制器中,我使用了 Authorize 属性
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
public class MyController : Controller
{
这使我可以使用以下代码捕获登录用户以进行各种 API 调用
var loggedInUser = User.Identity.Name;
如果我删除了授权属性,那么即使用户通过了身份验证,User.Identity.Name 也将始终为空。
如果令牌无效,如何使用授权属性但仍允许输入控制器方法?我想对要输入的授权用户和非授权用户使用相同的方法。然后,我将使用User.Identity.Name 来确定他们是否未经身份验证,并在他们的方法中包含来宾用户逻辑。
【问题讨论】:
-
我认为您可以编写自己的 Authorize 属性,例如
AuthorizeWithGuests并将逻辑放在该属性中,您将在其中进行检查并查看用户是否未通过身份验证,而不是将用户视为访客。 -
我不知道当前 Authorize 属性的内部结构,我认为我必须重写它,因为我无法继承它,因为它会阻止访问
-
是的,你必须在那里编写自己的代码,然后像这样使用它
[AuthorizeWithGuests]
标签: c# asp.net-core jwt asp.net-core-webapi asp.net-core-identity