.NET Core 中的自定义授权过滤器 API

Custom Authorization Filter in .NET Core API

我想在使用我的核心 api 访问任何数据之前授权用户,所以我尝试使用 JWT 身份验证。 我在使用 api 登录用户时成功生成了令牌,并将该令牌保存在客户端的 session 中,现在每当用户想要使用 api 访问任何数据时,我都会发送该令牌在 header 到 api 中,我想使用自定义授权过滤器验证该 JWT 令牌。我创建了自定义授权过滤器并将其应用于我的 GetMenu api,我能够成功验证该令牌,但在授权过滤器中进行令牌验证后,它没有在我的 GetMenu api.

这是我的 AccountController 代码:

[Filters.Authorization]
[AllowAnonymous]
[HttpPost]
[Route("GetMenu")]
public IActionResult GetMenu(string clientid, int rolecode, string repcode)
{
    //further process
}

这是我的 Filters.Authorization 代码:

public class Authorization: AuthorizeAttribute, IAuthorizationFilter
{
    public void OnAuthorization(AuthorizationFilterContext filterContext)
    {
        if (!ValidateToken(filterContext.HttpContext.Request.Headers["token"]))
        {
            filterContext.Result = new UnauthorizedResult();
        }
    }
}

我在 OnAuthorization 方法和 GetMenu 上设置了断点 api。 我正在通过邮递员调用我的 GetMenu api 进行测试,它在 Filters.Authorization 中的 OnAuthorization 方法上成功命中它并验证我的 JWT 令牌并在邮递员中显示状态代码:200 但在令牌验证成功后它应该点击 GetMenu api 进行进一步的数据处理,但没有点击。 可能是什么问题?我错过了什么?请帮忙。

如果请求成功授权,你不应该设置filterContext.Result

//
// Summary:
//     A context for authorization filters i.e. Microsoft.AspNetCore.Mvc.Filters.IAuthorizationFilter
//     and Microsoft.AspNetCore.Mvc.Filters.IAsyncAuthorizationFilter implementations.
public class AuthorizationFilterContext : FilterContext
{
    //
    // Summary:
    //     Gets or sets the result of the request. Setting Microsoft.AspNetCore.Mvc.Filters.AuthorizationFilterContext.Result
    //     to a non-null value inside an authorization filter will short-circuit the remainder
    //     of the filter pipeline.
    public virtual IActionResult Result { get; set; }
}

失败时只需要设置Result即可。

public class Authorization: AuthorizeAttribute, IAuthorizationFilter
{
    public void OnAuthorization(AuthorizationFilterContext filterContext)
    {
        if (!ValidateToken(filterContext.HttpContext.Request.Headers["token"]))
        {
            filterContext.Result = new UnauthorizedResult();
        }
    }
}