在ASP.Net Web API 2上支持多种授权属性的正确方法

时间:2018-12-16 00:40:06

标签: c# authentication asp.net-web-api asp.net-web-api2 asp.net-web-api-routing

我的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}

现在,我要求不要让用户进入,除非他们已经创建了一个帐户并验证了他们的电子邮件地址。所以我的想法是,在第一种方法(用户登录)中,我不仅要检查result.success并颁发令牌,还要检查所获取的帐户是否已通过电子邮件验证。如果不是,我会发出一个jwt令牌,并将附加声明“ emailverified”设置为false。因此,尚未激活其电子邮件的用户仍然可以登录并获取此jwt令牌,但是唯一允许他们进行的操作是VerifyEmail。

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

[HttpGet]
[AuthorizeEvenIfEmailNotVerified]
public IHttpActionResult GetAccount()

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

还是我会以错误的方式进行操作?作为记录,除非绝对需要,我希望使该项目远离任何与MVC相关的库。这也是.Net Framework 4.7项目。

1 个答案:

答案 0 :(得分:0)

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

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

下一步将属性添加到控制器:

[Authorize(Roles="NotVerified")]