2017-10-17 62 views
1

我有一個MVC Core應用程序,它有兩個過濾器。一個是AuthorizeFilter來檢查角色成員資格,另一個是ActionFilter,用於驗證應用程序和數據庫是否同步。授權失敗後執行ASP.NET Core MVC ActionFilter

Startup.cs:

services.AddMvc() 
     .AddMvcOptions(options => 
     { 
      options.Filters.Add(new AuthorizeFilter(new AuthorizationPolicyBuilder().AddRequirements(new RoleRequirement()).Build())); 
      options.Filters.Add(new DatabaseFilter()); 
     }) 

如果存在失配ActionFilter返回顯示錯誤消息的圖。

DatabaseFilter.cs:

public void OnActionExecuting(ActionExecutingContext context) 
{ 
    if (condition) 
    { 
     context.Result = new ViewResult 
     { 
      ViewName = "DbError" 
     }; 
    } 
} 

RoleRequirement.cs:

protected override async Task HandleRequirementAsync(AuthorizationHandlerContext context, RoleRequirement requirement) 
{ 
    if (condition) 
    { 
     context.Succeed(requirement); 
    } 
    else 
    { 
     context.Fail(); 
    } 

    return; 
} 

正在發生的事情是,如果未經授權的用戶使用應用程序時,有一個數據庫不匹配,他們顯示了數據庫錯誤視圖,而不是獲取403 Forbidden響應,就像沒有數據庫不匹配一樣。我寧願他們收到禁止的消息。

According to the documentation,在ActionFilterAuthorizationFilter運行,但它不能是短路甚至設置context.Fail()後的請求。

+0

你能源「根據文件」? – spottedmahn

+1

增加了對文檔的引用。 – Valuator

回答

0

回到這之後,它變得很明顯。授權過濾器將請求短路...然後指向錯誤控制器操作以返回自定義403頁面。錯誤控制器沒有授權,所以它下降到DatabaseFilter,它會像它應該那樣返回不匹配錯誤。