2016-08-30 41 views
1

我想添加一個自定義授權策略,它可以檢查json配置文件中提供的組的分隔列表。我正在使用ASP.Net 5 - MVC 6,以及Windows身份驗證。ASP.Net 5授權處理程序失敗重​​定向

一切工作正常,除了當我打電話給失敗。然後沒有任何反應顯示一個空白屏幕。這是我的HandleRequirementAsync方法。我已經爲任務結果嘗試了各種值。我一直在瘋狂地Google搜索,但沒有運氣。希望有人能幫助。

DESIRED RESULT:我想重定向到一個失敗的自定義頁面,但如果這是不可能的,至少能夠重定向回登錄頁面。似乎有任何影響的唯一的事情是拋出一個異常。

在啓動相關的註冊代碼:

var appSettings = Configuration.GetSection("AppSettings"); 
services.Configure<Models.AppSettings>(appSettings); 

services.AddMvc(); 

services.AddAuthorization(options => 
{ 
    options.AddPolicy("RoleAuth", policy => policy.Requirements.Add(new RolesRequirement(appSettings["AllowedGroups"]))); 
}); 

services.AddSingleton<IAuthorizationHandler, RoleAuthorizationHandler>(); 

和授權類:

public class RolesRequirement : IAuthorizationRequirement 
{ 
    public RolesRequirement(string groups) 
    { 
     Groups = groups; 
    } 

    public string Groups { get; private set; } 
} 

public class RoleAuthorizationHandler : AuthorizationHandler<RolesRequirement> 
{ 
    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, RolesRequirement requirement) 
    { 
     if (!string.IsNullOrWhiteSpace(requirement.Groups)) 
     { 
      Console.WriteLine(requirement.Groups); 
      var groups = requirement.Groups.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); 

      //we could check for group membership here.... maybe??? 
      foreach (var group in groups) 
      { 
       if (context.User.IsInRole(group)) 
       { 
        context.Succeed(requirement); 
        return Task.FromResult(0); 
       } 
      } 
     } 
     else 
     { 
      context.Succeed(requirement); 
     } 

     context.Fail(); 
     return Task.FromResult(0); 
    } 
} 
+0

目前還在尋找一種方式來重定向發生故障時,你有沒有運氣? –

+0

不是亞歷克斯。沒有運氣。抱歉。 – SpaceGhost440

回答

0

我跟着herostwist的建議去了,但政策可以挑戰或禁止。intesive研究後,我穿過什麼讓你這樣直接訪問AuthorizationFilterContext(來了,因爲他們遵循的命名約定,並從AuthorizeAttribute繼承:

public class BudgetAccessFilterAttribute : AuthorizeAttribute, IAuthorizationFilter 
{ 
    public void OnAuthorization(AuthorizationFilterContext context) 
    { 
     //context.HttpContext.User.Identity.Name 
     //TODO: determine if user has access to budget controllers, all of them could inherit from a Common Controller with this Filter 
     if (false) 
     { 
      //if no access then 
      context.Result = new RedirectToActionResult("Index", "Home", null); 
     } 
    }  
} 

然後,您可以裝飾你的控制器是這樣的:

[BudgetAccessFilter] 
public class BudgetItemController : Controller 
{ 

} 

如果你有很多控制器有相同的檢查,那麼他們都可以繼承基類,如下所示:

[BudgetAccessFilter] 
public class BCommonController : Controller 
{ 
} 

然後清潔控制器:

public class BudgetItemController : BCommonController 
{ 
} 
-2

我使用的,而不是窗戶,但在Startup.cs我我的配置方法cookie認證有以下代碼告訴它去哪裏

app.UseCookieAuthentication(new CookieAuthenticationOptions 
{ 
    LoginPath = "/account/login", 
    AuthenticationScheme = "Cookies", 
    AutomaticAuthenticate = true, 
    AutomaticChallenge = true 
}); 
+0

此解決方案只與cookie身份驗證相關。 –

-2

我不知道wh您可以配置重定向結果,但至少我可以創建一個將在失敗案例中顯示的「Account/AccessDenied.cshtml」文件。 「帳戶」是我的班級名稱,當發生故障時,瀏覽器被重定向到此Url:(http://localhost:39339/Account/AccessDenied?ReturnUrl=%2Fapp%2Fequipments

以下是我的控制器代碼(Web/AccountController.cs)。

public class AccountController : Controller 
{ 
    public IActionResult AccessDenied() 
    { 
     return View(); 
    } 
} 
+0

此代碼與問題無關。 –

2

我發現這樣做是唯一的辦法,不要用context.Fail(),而不是這樣做:

取代:

context.Fail(); 

有:

var mvcContext = context.Resource as AuthorizationFilterContext; 
mvcContext.Result = new RedirectToActionResult("Action", "Controller", null); 
context.Succeed(requirement); 

允許上下文成功,將執行上下文,該上下文現在是重定向。