2016-01-22 64 views
10

我在配置我的.Net MVC應用5 ADFS的一個問題。重定向循環與.net MVC授權與ADFS屬性索賠

我已經在VS 2015中配置了我的項目來使用聲明,它工作正常,但我有一個問題。

我可以登錄,尤斯ADFS,我可以檢查用戶角色等問題occures當我嘗試使用

[Authorize(Roles="somenonExistingRole")] 

儘管我已經驗證我重定向到ADFS頁面,當身份驗證再次發生,我被重定向到我的頁面,在那裏循環發生。頁送我去ADFS門戶,ADFS重定向我對門戶網站,試了幾次後,我從ADFS錯誤(很多請求)

我必須由我自己來實現類似角色的供應商?或者我需要配置一些額外的東西。也許我可以只限制嘗試次數?爲什麼我有我的角色allready時,我重定向到ADFS?

沒有太多的代碼中actualy顯示,UT的要求: 控制器,即時通訊測試:

public class HomeController : Controller 
    { 
     public ActionResult Index() 
     { 
      return View(); 
     } 
     [Authorize] 
     public ActionResult About() 
     { 
      var u = HttpContext.User; 


      if (u.IsInRole("/")) 
      { 
       ViewBag.Message = "User is in role."; 
      } 
      else 
      { 
       ViewBag.Message = "User is NOT in role."; 
      } 

      return View(); 
     } 
     [Authorize(Roles = "/nonexistingRole")] 
     public ActionResult Contact() 
     { 

      ViewBag.Message = "Your contact page."; 

      return View(); 
     } 
    } 

和配置AUTH部分

public void ConfigureAuth(IAppBuilder app) 
{ 
    app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType); 

    app.UseCookieAuthentication(new CookieAuthenticationOptions()); 

    app.UseWsFederationAuthentication(
     new WsFederationAuthenticationOptions 
     { 
      Wtrealm = realm, 
      MetadataAddress = adfsMetadata, 

     }); 
} 
+0

你是什麼AuthenticateAttribute:

該類創建使用VS 2015年一個新的MVC項目時產生?能否請您告訴我們的代碼 – Thomas

+0

索裏 - 從內存中寫入授權offcourse :) – bunny1985

+0

你是否有配置AUTHENT一個Startup.Auth類? – Thomas

回答

11

要解決環路問題,您應該覆蓋AuthorizeAttribute

默認情況下,MVC返回401未經授權當用戶的角色不符合AuthorizeAttribute要求。這將重新認證請求初始化給身份提供者。由於用戶已經登錄,AD返回到相同的頁面,然後發出另一個401,創建重定向循環。在這裏,我們重寫AuthorizeAttribute的HandleUnauthorizedRequest方法,以顯示在我們的應用程序上下文中有意義的內容。

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)] 
public class AuthorizeAttribute : System.Web.Mvc.AuthorizeAttribute 
{   
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
     if (filterContext.HttpContext.Request.IsAuthenticated) 
     { 
      //One Strategy: 
      //filterContext.Result = new System.Web.Mvc.HttpStatusCodeResult((int)System.Net.HttpStatusCode.Forbidden); 

      //Another Strategy: 
      filterContext.Result = new RedirectToRouteResult(
       new RouteValueDictionary(
        new 
        { 
         controller = "Error", 
         action = "ShowError", 
         errorMessage = "You do not have sufficient priviliges to view this page." 
        }) 
       ); 
     } 
     else 
     { 
      base.HandleUnauthorizedRequest(filterContext); 
     } 
    } 
} 
+0

但它在用戶有角色時起作用。只有當用戶不在角色中時,問題纔會發生。 – bunny1985

+0

我編輯了我的帖子 – Thomas

+0

非常感謝 – bunny1985