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!!
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