ASPNET核心识别哪个需求策略失败

时间:2017-08-25 05:08:44

标签: security .net-core authorize-attribute

使用授权策略时,是否可以了解哪个策略没有成功?

理想情况下,我希望能够修改中间件管道中的数据,以更好地确定将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()
    }

 });

1 个答案:

答案 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}");                        
    }