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