webentwicklung-frage-antwort-db.com.de

Fügen Sie eine Rolle in ASP.NET Identity hinzu

Wie kann ich eine Rolle im neuen ASP.NET-Identitätssystem (1.0) hinzufügen? Es gibt eine Klasse UserStore, aber keine Klasse RoleStore.

Ich kann keine Dokumentation zu diesem Thema finden.

39
daniel
RoleManager = new RoleManager<IdentityRole>(
                  new RoleStore<IdentityRole>(new MyDbContext()));
var roleresult = RoleManager.Create(new IdentityRole(roleName));
42
graycrow

Ab .NET Framework 4.5 wurde Windows Identity Foundation (WIF) vollständig in .NET Framework integriert.

Ich würde raten, die Möglichkeit zu prüfen, nach meiner Meinung die Autorisierung durch Ansprüche umzusetzen ( Rollen als Ansprüche ausdrücken ).

Wenn die IsInRole () -Methode aufgerufen wird, wird überprüft, ob der aktuelle Benutzer diese Rolle hat. In anspruchssensitiven Anwendungen wird die Rolle durch einen Rollenanspruchstyp ausgedrückt, der im Token verfügbar sein sollte.

Der Typ des Rollenanspruchs wird mithilfe des folgenden URI ausgedrückt: " http://schemas.Microsoft.com/ws/2008/06/identity/claims/role "

Aus dem UserManager können Sie so etwas machen (ohne den RoleManager):

var um = new UserManager();
um.AddClaimAsync(1, new Claim(ClaimTypes.Role, "administrator"));

Ansprüche können die Leistung von Authentifizierungs- und Autorisierungsprozessen vereinfachen und steigern. Sie können die als Ansprüche gespeicherten Rollen verwenden, um Back-End-Abfragen bei jeder Autorisierung zu entfernen.

Mit Claims benötigen Sie den RoleStore nicht mehr (zumindest für die entsprechenden Berechtigungszwecke ...)

34
MyOwnWay

Ich habe die folgenden Snippets in einer asp.net-Beispielwebseite verwendet page_load, um zu verstehen, wie ASP Identity works) funktioniert

   UserManager userManager = new UserManager();
    var roleStore = new RoleStore<IdentityRole>(new ApplicationDbContext());
    var roleManager = new RoleManager<IdentityRole>(roleStore);
    var applicationRoleAdministrator = new IdentityRole("superadmin");
    if (!roleManager.RoleExists(applicationRoleAdministrator.Name))
    {
        roleManager.Create(applicationRoleAdministrator);
    }
     ApplicationUser applicationUserAdministrator = userManager.FindByName(User.Identity.Name);

    if (!userManager.GetRoles(applicationUserAdministrator.Id).Contains("superadmin"))
    {
        Response.Redirect("~/account/login.aspx?ReturnUrl=" + Request.Url.AbsolutePath);
    }

Natürlich wird ApplicationDbContext mit ASP.NET 4.5+ -Vorlagen wie unten automatisch generiert

 public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
    {
        public ApplicationDbContext()
            : base("DefaultConnection")
        {
        }
    }

Erstellen Sie auch eine Anwendungsrollen-Manager-Klasse

public class ApplicationRoleManager : RoleManager<IdentityRole>
{
    public ApplicationRoleManager(IRoleStore<IdentityRole, string> roleStore)
        : base(roleStore)
    {
    }

    public static ApplicationRoleManager Create(IdentityFactoryOptions<ApplicationRoleManager> options, IOwinContext context)
    {
        //return new ApplicationRoleManager(new RoleStore<IdentityRole>(context.Get<ApplicationDbContext>()));
        return new ApplicationRoleManager(new RoleStore<IdentityRole>(new ApplicationDbContext()));
    }
}

fügen Sie außerdem die folgende Zeile in Ihrer startup.Auth.cs => ConfigureAuth (IAppBuilder-App) -Methode hinzu

  app.CreatePerOwinContext<ApplicationRoleManager>(ApplicationRoleManager.Create);

Und dann in Ihrem Controller:

private ApplicationRoleManager _roleManager;

public ApplicationRoleManager RoleManager
{
    get
    {
        return _roleManager ?? HttpContext.GetOwinContext().Get<ApplicationRoleManager>();
    }
    private set
    {
        _roleManager = value;
    }
}

Ich bin neu in diesem Identity Stuff und ich bin nicht sicher, ob es notwendig ist oder ich mache es sauber und richtig, aber diese Schritte haben für mich funktioniert

6
Iman Abidi

Die ASP.NET-Identität ist den Ansprüchen in Bezug auf Rollen bewusst. Das hat mich wirklich verwirrt, weil Sie im vorherigen System die Mitgliedschafts- und Rollenanbieter in web.config konfiguriert haben.

Das Problem für mich ist, dass ich folgenden Code habe:

HttpContext.Current.User.IsInRole("some role")

Glücklicherweise funktioniert diese Logik immer noch. Sie können die Logik in der Funktion CreateAsync in ClaimsIdentityFactory.cs sehen, die sich in Microsoft.AspNet.Identity.Core Befindet. Eines der Argumente ist UserManager. Es fragt, ob es SupportsUserRole ist, und wenn ja, ruft es GetRolesAsync auf und fügt jede Rolle als Anspruch zum ClaimIdentity hinzu. Es besteht keine Notwendigkeit, dies selbst zu tun.

IsInRole verwendet Ansprüche wie hier beschrieben:

http://msdn.Microsoft.com/en-us/library/hh545448.aspx

2
user3303254