在ASP.NETWeb API 2上支持多个授权属性的正确方法



我的ASP.Net Web API应用程序在成功登录时创建了一个JWT令牌。

public IHttpActionResult LogOn([FromBody] LoginRequest request)
{
var result = _service.LogOn(request);
if (result.Success)
{
var token = CreateToken(request.UserName);
return Ok(OpResult<string>.SuccessResult(token));
}
return Ok(result);
}

我用"Authorize"属性装饰了所有控制器方法,该属性委托给我的TokenValidationHandler(从DelegatingHandler继承(,以在后续请求中验证令牌。

[HttpGet]
[Authorize]
public IHttpActionResult GetAccount(){ // get user details here}

现在我有一个要求,除非用户创建了一个帐户并验证了他们的电子邮件地址,否则不要让用户进入。因此,我的想法是,在第一种方法(用户登录(中,我不只是检查结果。成功并发布令牌,而是检查检索到的帐户是否经过电子邮件验证。如果没有,我会发布一个jwt令牌,并将额外的声明"emailverified"设置为false。因此,尚未激活eMail的用户仍然可以登录并获得此jwt令牌,但他们唯一允许的操作是VerifyEmail。

如何实现此VerifyEmail控制器方法?理想情况下,我希望它看起来像低于

[HttpGet]
[AuthorizeEvenIfEmailNotVerified]
public IHttpActionResult GetAccount()

如何实现AuthorizeEvenIfEmailNotVerified?它是从DelegatingHandler继承的另一个处理程序吗?但是,如果我有两个这样的处理程序(我现有的用于常规授权的处理程序和这个新的处理程序(,那么ASP.Net引擎如何知道将[authorize]属性发送到哪个处理程序,将[AuthenticateEvenIfEmailNotVerified]发送到哪个?或者我应该使用AuthenticationFilter?但在这种情况下,我有两个属性在做几乎相同的事情,这似乎很奇怪(一个验证已验证的用户,另一个验证未验证的用户(。但其中一个是通过继承DelegatingHandler的处理程序支持的[Authorize]实现的,而另一个则是通过AuthenticationFilter支持的属性实现的?

还是我走错了路?为了记录在案,除非绝对需要,否则我更愿意保持项目中没有任何MVC相关的库。这也是.Net Framework 4.7项目。

角色可能是最简单的解决方案。生成具有相关声明的令牌:

identity.AddClaim(new Claim(ClaimTypes.Role, "Verified")); //verified email
identity.AddClaim(new Claim(ClaimTypes.Role, "NotVerified")); //not verified email

下一个添加属性到控制器:

[Authorize(Roles="NotVerified")]

最新更新