2015-05-08 6 views
5

Ich habe seit ein paar Tagen nach einer Antwort auf diese Frage gesucht, aber ich habe keinen Erfolg gefunden. Ich würde die Links posten, aber es würde wahrscheinlich die ganze Seite einnehmen.Hinzufügen von Rollen zu ADFS IPrincipal

Also hier ist, was ich habe ...

ich eine MVC-Anwendung haben, die die WC-Federation-Protokoll verwendet. Ich war in der Lage, die Anwendung so zu konfigurieren, dass sie die Benutzer authentifiziert und die Ansprüche von ADFS zurückgibt. Das funktioniert perfekt. Ich kann auch alle Ansprüche ohne Probleme extrahieren. Aber ich mache das innerhalb einer der Aktionen im Controller.

Und hier ist es, was ich tun will ...

Ich möchte ADFS verwenden, um den Benutzer zu authentifizieren, aber ich möchte meine eigenen internen Rollen verwenden, um den Benutzer zu autorisieren den Zugriff auf bestimmte Steuerungen (zB [Authorize(Roles = "CoolRole")].) Ich möchte in der Lage sein, dies zu tun, weil ich bereits eine Web-API, die OAuth 2.0 verwendet, mit einer Back-End-SQL Server-Datenbank zur Verwaltung von Benutzern und Rollen (interne und externe Benutzer). Ich möchte jetzt ein sicheres Portal Ermöglichen Sie internen Benutzern den Zugriff auf die Daten mit einer Single-Sign-On-Erfahrung. Mit Blick auf das Controller Modell, bemerkte ich, es gibt einige Eigenschaften mit dem Authentifizierungsprozess verbunden (OnAuthentication, OnAuthenticationChallenge) und einem für das Zulassungsverfahren (OnAuthorization.)

ich nicht unbedingt den Code benötigen, aber ich fühle mich wie ich Ich habe einen Stein getroffen und ich muss in die richtige Richtung zeigen.

UPDATE

Ich versuchte dies:

protected override void OnAuthorization(
     System.Web.Mvc.AuthorizationContext filterContext) 
{ 
    //Private class to create a new IPrincipal based on my AppUserMgr 
    var user = _setCurrentUser(
        (ClaimsIdentity)filterContext.HttpContext.User.Identity); 
    filterContext.HttpContext.User = user; 

    base.OnAuthorization(filterContext); 
} 

Dies ergab eine 401 (Unauthorized) Antwort.

und ...

protected override void OnAuthentication(
    System.Web.Mvc.Filters.AuthenticationContext filterContext) 
{ 
    //Private class to create a new IPrincipal based on my AppUserMgr 
    var user = _setCurrentUser(
        (ClaimsIdentity)filterContext.HttpContext.User.Identity); 
    filterContext.Principal = user; 

    base.OnAuthorization(filterContext); 
} 

dies nur der STS mehrmals aufruft, bevor sie ausfällt. Ich habe sogar versucht nach der Zuweisung zu swappen, nachdem die Base in beiden aufgerufen wird. Kein Glück.

Vor den vorherigen, ich habe auch versucht, eine AuthorizeFilter zum Steuerelement hinzuzufügen, aber das half auch nicht:

http://pratapreddypilaka.blogspot.in/2012/03/custom-filters-in-mvc-authorization.html

+0

Können Sie Ihre Implementierung teilen. Hast du ein Template in git? – Avi

Antwort

3

die Antwort gefunden, YESSS !!!

Also, ich diesen Link gefunden: http://brockallen.com/2013/01/17/adding-custom-roles-to-windows-roles-in-asp-net-using-claims/

Von dort habe ich meinen Weg durch erraten, gut Art :)

Hier ist die Grundlagen dessen, was ich getan habe:

Ich landete überschreibt die OnAuthentication-Methode des Controllers, stellte jedoch sicher, dass die Base aufgerufen wurde. Ich habe das innerhalb einer erweiterten Klasse gemacht. Hier ist das Konzept:

public class AdfsController : Controller 
{ 
    //Some code for adding the AppUserManager (used Unity) 
    protected override void OnAuthentication(
      System.Web.Mvc.Filters.AuthenticationContext filterContext) 
    { 
     base.OnAuthentication(filterContext); 
     //Private method to set the Principal 
     _setCurrentUser(filterContext.Principal); 
    } 

    private void _setCurrentUser(IPrincipal principal) 
    { 
     //Put code to find to use your ApplicationUserManager or 
     //dbContext. roles is a string array 

     foreach(var role in roles) 
     { 
      ((ClaimsIdentity)((ClaimsPrincipal)principal).Identity) 
       .AddClaim(new Claim(ClaimTypes.Role, role)); 
     } 
    } 
} 

Im Controller können Sie nun die Add:

public class HomeController : AdfsController 
{ 
    //I used a magic string for demo, but store these in my globals class 
    [Authorize(Roles = "CoolRole")] 
    public ActionResult Index() 
    { 
     return View(); 
    } 
} 

ich diese getestet, indem eine Rolle für den aktuellen Benutzer zugewiesen prüft, und das hat funktioniert! Dann änderte ich die Rolle in etwas wie "ablehnen", dem der Benutzer nicht zugewiesen wurde; und ich erhielt eine 401 Unautorisierte. Also, ja, ziemlich cool!

Ich weiß, ich war derjenige, der das fragte, aber hoffentlich findet jemand das hilfreich und spart ihnen etwas Zeit.

~ Prost!

+0

Ich benutzte den Code von dem Link, den Sie veröffentlicht haben, wäre toll zu sehen, dass zu Ihrer Antwort auch hinzugefügt. – Nacht

-2

ADFS ist die Authentifizierung/Tokendienst in Azure. Zum Aktivieren der rollenbasierten Authentifizierung können Sie den Azure-RBAC-Dienst (Role Based Access Control) verwenden, um die Ansprüche, die Sie von ADFS erhalten, zu erweitern und die Rollen, die Sie von RBAC erhalten, dem Token hinzuzufügen und dasselbe Token zu verwenden so in Ihrem API sperrt oder das Backend mit den Augmented-Token sichern ... hier ist die Referenz für RBAC:

http://azure.microsoft.com/en-in/documentation/articles/role-based-access-control-configure/

+0

Hierbei wird Azure AD zum Verwalten von Benutzern verwendet. Ich möchte Azure AD nicht zum Verwalten des Benutzers verwenden, da ich das ADFS (vor Ort) zur Authentifizierung verwenden möchte. Außerdem versuche ich nicht, meine API zu sichern. Ich versuche, eine neue MVC-Anwendung zu sichern. – Rogala

+0

Vereinbarte mit Rogala – Avi