2015-05-06 16 views
5

Ich baue eine Intranet-Anwendung ASP.NET MVC 5.Hinzufügen von benutzerdefinierten Rollen Fenster Rollen in ASP.NET MVC 5

Mein Ziel die Authentifizierung von jedem Benutzer vom Active Directory vorgenommen haben (dh Ich benutze die "Windows-Authentifizierung" und füge Gruppen zu jedem Benutzer innerhalb der Anwendung hinzu (NICHT mit Domänengruppen).

http://brockallen.com/2013/01/17/adding-custom-roles-to-windows-roles-in-asp-net-using-claims/

Aber es funktioniert nicht in meinem Szenario: wenn ich den Controller mit [autorisieren (Role = "AppRole")] dekorieren,

Ich habe einige sehr interessante Stück Code hier Ich kann nicht autorisiert werden, auch wenn der Benutzer (Ansprüche verwenden) mit der Rolle "AppRole" verknüpft ist.

Dies ist mein Code:

In Global.asax.cs

void Application_PostAuthenticateRequest() 
    { 
     if (Request.IsAuthenticated) 
     { 

      string[] roles = Utils.GetRolesForUser(User.Identity.Name); 

      var id = ClaimsPrincipal.Current.Identities.First(); 
      foreach (var role in roles) 
      { 
       //id.AddClaim(new Claim(ClaimTypes.Role, role.ToString())); 
       id.AddClaim(new Claim(ClaimTypes.Role, @"Kairos.mil\Compliance")); 
      } 


      bool pippo = User.IsInRole("Compliance"); 

      HttpContext.Current.User = (IPrincipal)id ; 

      bool pippo2 = User.IsInRole("Compliance"); 


     } 
    } 

Die Funktion GetRolesForUser ist wie folgt (und funktioniert gut):

public static string[] GetRolesForUser(string username) 
    { 
     dbOrdiniPersonaliEntities db = new dbOrdiniPersonaliEntities(); 

     string utente = StripDomain(username); 

     string[] gruppi = new string[db.vGruppiUtentis.Where(t => t.KairosLogin == utente).Count()]; 

     int i=0; 

     foreach (var gruppo in db.vGruppiUtentis.Where(t => t.KairosLogin == utente)) 
     { 

      gruppi[i]=gruppo.GruppoDes; 
      i=i++; 
     } 
     return gruppi; 
    } 

und der Controller dekoriert mit dem "Standard" Authorize-Klausel:

[Authorize(Roles="AppRole")] 
    public ActionResult Index(string sortOrder, string currentFilter, string DesSearchString,int? page) 
    { 
     // my code here 
    } 

Irgendeine Idee?

Vielen Dank im Voraus

UPDATE

Dank @Leandro Ich habe versucht, wie Sie den folgenden Code

void Application_PostAuthenticateRequest() 
    { 
     if (Request.IsAuthenticated) 
     { 

      string[] roles = Utils.GetRolesForUser(User.Identity.Name); 

      ClaimsIdentity id = ClaimsPrincipal.Current.Identities.First(); 
      foreach (var role in roles) 
      { 
       //id.AddClaim(new Claim(ClaimTypes.Role, role.ToString())); 
       id.AddClaim(new Claim(ClaimTypes.Role, @"Kairos.mil\Compliance")); 
      } 

      bool pippo = User.IsInRole("Compliance"); 

      SetPrincipal((IPrincipal)id); 

      bool pippo2 = User.IsInRole("Compliance"); 


     } 
    } 

Aber vorgeschlagen erhalte ich einen Laufzeitfehler, wenn der Code erreicht diesen Punkt

SetPrincipal((IPrincipal)id); 

Der Fehler ist als

kann nicht folgt Objekt des Typs 'System.Security.Principal.WindowsIdentity' to cast 'System.Security.Principal.IPrincipal' einzugeben.

ASP.NET MVC and Windows Authentication with custom roles

Im Anschluss an die Antwort

Danke für Ihre Hilfe

UPDATE 2 (vielleicht gelöst)

Hallo Blick tiefer in SO habe ich diese Ressource gefunden von @Xhalent, änderte ich meinen Code wie folgt

protected void Application_PostAuthenticateRequest() 
    { 
     if (Request.IsAuthenticated) 
     { 
      String[] roles = Utils.GetRolesForUser(User.Identity.Name); 

      GenericPrincipal principal = new GenericPrincipal(User.Identity, roles); 

      Thread.CurrentPrincipal = HttpContext.Current.User = principal; 
     } 
    } 

Es scheint jetzt funktioniert gut! Irgendwelche Kommentare? Irgendwelche Nachteile? Danke vielmals!!

+0

Das funktioniert. Ich bin froh, das zu finden. Nur etwas, das ein bisschen verbessert werden kann. Anstatt Principle in Application_PostAuthenticateRequest zu setzen, benutze Application_AuthenticateRequest wie im Link https://forums.asp.net/t/2124141.aspx?how+angezeigt, um + benutzerdefinierte+Rollen zu verwenden + mit + Authentifizierung + in+MVC + Anwendung. Bitte verwenden Sie den Code in einem if mit der Bedingung HttpContext.Current.User! = Null, da diese Methode sowohl vor dem Einstellen des Benutzers als auch nach dem Einstellen des Benutzers aufgerufen wird. – sam113

Antwort

2

Mit dieser Methode können die Haupt speichern, so setzt er sich auch in dem Thread:

 private void SetPrincipal(IPrincipal principal) 
     { 
      Thread.CurrentPrincipal = principal; 
      if (HttpContext.Current != null) 
      { 
       HttpContext.Current.User = principal; 
      } 
     } 

aktualisieren: Auch anonym und Test ermöglichen, wenn User.IsInRole etwas innerhalb der Methode ist zu bekommen.

+0

danke. Wo muss ich die Methode SetPrincipal verwenden? Welcher Code sollte diese Methode aufrufen? –

+1

Im globalen Ajax, nachdem Sie den Benutzer autorisiert haben. Sie legen die HttpContext.Current.User = (IPrincipal) ID fest, aber Sie müssen den Prinzipal einrichten. Hier finden Sie Beispiele: http://StackOverflow.com/questions/26464848/custom-authorization-in-asp-net-webapi-what-a-mess –

Verwandte Themen