2015-05-06 5 views
5

Sto costruendo un'applicazione intranet utilizzando ASP.NET MVC 5.Aggiunta di ruoli personalizzati a ruoli di Windows in ASP.NET MVC 5

Il mio obiettivo è quello di avere l'autenticazione di un utente da parte del Active Directory (cioè Sto usando la "Autenticazione di Windows"), quindi aggiungo gruppi a qualsiasi utente all'interno dell'applicazione (NON utilizzo di gruppi di domini).

ho trovato qualche pezzo molto interessante di codice qui:

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

Ma non sta funzionando nel mio scenario: quando decorare il controller con [Autorizza (role = "AppRole")], Non posso essere autorizzato anche se l'utente (utilizzando Reclami) è associato al ruolo "AppRole".

Questo è il mio codice:

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"); 


     } 
    } 

La GetRolesForUser funzione è la seguente (e sta lavorando bene):

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

E il controller è decorato con la clausola Autorizza "standard":

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

Qualche idea?

Grazie in anticipo

UPDATE

Grazie @Leandro che ho provato come lei ha suggerito il seguente codice

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"); 


     } 
    } 

Ma ricevono un errore di runtime quando il codice raggiunge questo punto

SetPrincipal((IPrincipal)id); 

L'errore è il seguente

Impossibile eseguire il cast oggetto di tipo 'System.Security.Principal.WindowsIdentity' digitare 'System.Security.Principal.IPrincipal'.

Grazie per il vostro aiuto

UPDATE 2 (forse risolto)

Hi Guardando più in profondità Così, ho trovato questa risorsa

ASP.NET MVC and Windows Authentication with custom roles

In seguito alla risposta di @Xhalent, ho modificato il mio codice come segue

012.351.
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; 
     } 
    } 

Sembra che ora lavora bene! Qualche commento? Qualche inconveniente? Molte grazie!!

+0

Questo funziona. Sono felice di trovarlo. Solo qualcosa che può essere migliorato un po '. Invece di impostare Principle in Application_PostAuthenticateRequest, utilizzando Application_AuthenticateRequest come indicato nel link https://forums.asp.net/t/2124141.aspx?How+to+use+custom+Roles+using+Windows+Authentication+in+MVC+ Applicazione. Si prega di utilizzare il codice all'interno di un if con la condizione HttpContext.Current.User! = Null quando questo metodo viene chiamato prima di impostare l'utente e dopo aver impostato l'utente. – sam113

risposta

2

Utilizzare questo metodo per salvare il capitale, in modo da esso imposta anche nel thread:

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

Aggiornamento: permettono anche anonima e verificare se User.IsInRole è ottenere qualcosa all'interno del metodo.

+0

grazie. Dove devo usare il metodo SetPrincipal? Quale parte di codice dovrebbe chiamare questo metodo? –

+1

Nell'ajax globale dopo aver autorizzato l'utente. Si imposta HttpContext.Current.User = (IPrincipal) id ma è necessario impostare il principal. Guarda qui per gli esempi: http://stackoverflow.com/questions/26464848/custom-authorization-in-asp-net-webapi-what-a-mess –