使用授权策略时,是否可以了解哪个策略没有成功?
理想情况下,我希望能够修改中间件管道中的数据,以更好地确定将403返回给API使用者的原因。
此刻返回的所有内容都是403;禁止的。
[Authorize] // Azure auth
[Authorize(Policy="SessionIsValid")] // Ensure transaction sessions are valid
public class TaskController : Controller
{ /** code removed for brevity */ }
是否可以在Statup.cs的configure方法中了解失败策略的原因?
app.Use(async (context, next) =>
{
await next();
if (context.Response.StatusCode == 403 )
{
// which policy failed? need to inform consumer which requirement was not met
await next()
}
});
答案 0 :(得分:3)
来自ASPNET核心文档
Resource属性的使用是特定于框架的。使用Resource属性中的信息会将授权策略限制为特定框架。您应该使用as关键字强制转换Resource属性,然后检查强制转换是否成功,以确保您的代码在其他框架上运行时不会因InvalidCastExceptions而崩溃;
我的实施
context.Fail();
if ( context.Resource is Microsoft.AspNetCore.Mvc.Filters.AuthorizationFilterContext mvcContext) {
mvcContext.HttpContext.Response.StatusCode = 403;
await mvcContext.HttpContext.Response.WriteAsync($"Forbidden; No valid Transaction Session Id for {context.User.Identity.Name}");
}