.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();
}
}
}
我想在使用我的核心 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();
}
}
}