2016-01-22 19 views
10

Ich habe ein Problem beim Konfigurieren von ADFS mit meiner .Net MVC 5 App.Redirect-Schleife mit .Net MVC Autorisieren Attribut mit ADFS Ansprüche

Ich habe mein Projekt in VS 2015 konfiguriert, um Ansprüche zu verwenden, und es funktioniert ok, aber ich habe ein Problem.

kann ich anmelden, Ussing ADFS, kann ich Benutzerrollen usw. Das Problem occures überprüfen, wenn i

[Authorize(Roles="somenonExistingRole")] 

trotz zu verwenden versuchen, dass ich bereits authentifiziert bin ich auf ADFS-Seite umgeleitet werde, wenn Authentifizierung findet erneut statt und ich werde auf meine Seite weitergeleitet, wo eine Schleife auftritt. Seite senden Sie mich an ADFS-Portal, ADFS leitet mein Portal um, und nach ein paar Versuchen bekomme ich einen Fehler von ADFS (zu vielen Anfragen)

Muss ich so etwas wie Rollenanbieter von mir selbst implementieren? oder ich muss etwas extra konfigurieren. Vielleicht könnte ich die Anzahl der Versuche beschränken? Warum werde ich zu ADFS weitergeleitet, wenn ich bereits meine Rollen habe?

gibt es nicht viel actualy im Code zu erhalten, ut wie gewünscht: der Controller, der im Test:

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(); 
     } 
    } 

und der configure Auth Abschnitt

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

    app.UseCookieAuthentication(new CookieAuthenticationOptions()); 

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

     }); 
} 
+0

Was ist Ihr AuthenticateAttribute? Können Sie uns bitte zeigen Sie den Code – Thomas

+0

Sory - geschrieben aus dem Speicher Autorisieren Sie natürlich :) – bunny1985

+0

Haben Sie eine Startup.Auth-Klasse, die Authentifizierung konfigurieren? – Thomas

Antwort

11

die Schleife Problem zu beheben , sollten Sie die AuthorizeAttribute überschreiben.

Standardmäßig gibt MVC 401 Unauthorized zurück, wenn die Rollen eines Benutzers die Anforderungen AuthorizeAttribute nicht erfüllen. Dies initialisiert eine erneute Authentifizierungsanforderung an den Identitätsanbieter. Da der Benutzer bereits angemeldet ist, kehrt AD zur selben Seite zurück, die dann eine weitere 401, erstellt und eine Umleitungsschleife erstellt. Hier überschreiben wir die HandleUnauthorizedRequest-Methode des AuthorizeAttribute, um etwas anzuzeigen, das im Zusammenhang mit unserer Anwendung sinnvoll ist.

Diese Klasse erzeugt wurde, wenn ein neues MVC-Projekt mit VS 2015 erstellen:

[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

, aber es funktioniert, wenn der Benutzer eine Rolle hat. Das Problem tritt nur auf, wenn der Benutzer NICHT in der Rolle ist. – bunny1985

+0

Ich habe meinen Beitrag bearbeitet – Thomas

+0

vielen Dank – bunny1985