webentwicklung-frage-antwort-db.com.de

Autorisierung der .net Core Identity 2.1-Rolle funktioniert nicht

Ich habe die rollenbasierte Authentifizierung vor Version 2.1 bereits mehrmals implementiert. Befolgen Sie die Schritte, um die neuen 2.1-Identitäten zu erstellen.

Ich habe das IdentityUser-Modell erweitert, um zusätzliche Felder hinzuzufügen. Die Anmeldung funktioniert einwandfrei. Neue Felder sind vorhanden.

startup.cs configure services enthält

         services.AddDefaultIdentity<AppUser>()
            .AddRoles<IdentityRole>()
            .AddEntityFrameworkStores<ApplicationDbContext>();

Ich habe die Rollen ausgesät

         IdentityRole role = new IdentityRole();
         role.Name = "Administrator";
         IdentityResult roleResult = roleManager.
         CreateAsync(role).Result;

Erstellen Sie anschließend einen Benutzer und fügen Sie ihn der Rolle hinzu

        AppUser user = new AppUser();
        user.UserName = "Admin";
        user.Email = "[email protected]";
        user.Name = "Administrator";
        user.LockoutEnabled = false;
        user.EmailConfirmed = true;

        IdentityResult result = userManager.CreateAsync(user, "password").Result;

        if (result.Succeeded)
        {
            userManager.AddToRoleAsync(user, "Administrator").Wait();
        }

Alles war erfolgreich und die Datenbank sieht gut aus (AspNetUserRoles hat Links)

Das Dekorieren eines Controllers mit einer Rolle wird jedoch immer nicht autorisiert zurückgegeben

       [Authorize(Roles = "Administrator")]

Aber eine einfache Login-Prüfung mit [Authorize] (keine Rolle) wird funktionieren.

Wie kann ich das beheben/was ist der einfachste Weg, den Quellcode einzubinden, damit ich das [Authorize] Stichworte?

9
cdurth

Wie repariert man

Das Dekorieren eines Controllers mit einer Rolle wird jedoch immer als nicht autorisiert zurückgegeben

  [Authorize(Roles = "Administrator")]

Es ist ein bekannter Fehler in der Version von 2.1. Siehe Problem hier.

Ich folge dem Ratschlag die von HaoK und C-BERBER vorgeschlagene alte API zu verwenden und es funktioniert jetzt einwandfrei.

Hier ist mein DbContext:

public class ApplicationDbContext : IdentityDbContext<AppUser,IdentityRole,string>
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
        : base(options)
    {
    }
}

Konfigurieren Sie die Identität mit der API alten Stils:

services.AddIdentity<AppUser, IdentityRole>()
        .AddRoleManager<RoleManager<IdentityRole>>()
        .AddDefaultUI()
        .AddDefaultTokenProviders()
        .AddEntityFrameworkStores<ApplicationDbContext>();

Abmelden und erneutes Anmelden funktionieren nun wie erwartet.

Wie man den Quellcode debuggt

Ich vermute, Sie möchten das AuthorizeAttribe selbst nicht debuggen, da es zur Kompilierungszeit verarbeitet wird. Wenn Sie das AuthorizeFilter debuggen möchten, können Sie die folgenden Schritte ausführen:

klicken Sie auf Tools -> Options -> Debugging

  1. innerhalb von General deaktivieren Sie das Enable Just My Code in Visual Studio
  2. wählen Enable Source Link Support
  3. stellen Sie sicher, dass in Symbols der Microsoft Symbol Server ausgewählt ist

Und Sie können den Quellcode jetzt debuggen. Aufgrund der Funktionsweise des Filters müssen Sie jedoch vor MVC einen Haltepunkt festlegen. Ich habe gerade eine Dummy-Middleware eingerichtet, die vor dem MVC-Router-Handler ausgeführt wird:

enter image description here

Der Screenshot zum Debuggen von AuthorizeFiler:

enter image description here

7
itminus

In meinem Fall von ASP.NET Core 3 (Vorschau) + Angular war die Lösung AddAuthentication

services.AddDefaultIdentity<ApplicationUser>()
    .AddRoles<IdentityRole>()
    .AddRoleManager<RoleManager<IdentityRole>>()
    .AddEntityFrameworkStores<ApplicationDbContext>();

services.AddAuthentication(options =>
{
    options.DefaultAuthenticateScheme = IdentityConstants.ApplicationScheme;
    options.DefaultChallengeScheme = IdentityConstants.ApplicationScheme;
    options.DefaultSignInScheme = IdentityConstants.ExternalScheme;
});
0
baur

Ich habe die Rolle im Claim hinzugefügt. Dann funktioniert es sowohl für die Benutzeroberfläche (HttpContext.User.IsInRole("Admin")) als auch für das authorize-Attribut ([Authorize(Roles = "Admin")]).

Startup.cs-Datei:

public void ConfigureServices(IServiceCollection services)
{    
    services.AddIdentity<ApplicationUser, IdentityRole>()                
      .AddEntityFrameworkStores<WandContext>();
    ///..... other code
} 

Während der Authentifizierung füge ich meinem Anspruch eine Rolle hinzu.

var invalidLoginAttempt = false;
var user = await _userManager.FindByNameAsync(loginModel.Email);
if (user != null)
{
    var result = await _signInManager.CheckPasswordSignInAsync(user, loginModel.Password, lockoutOnFailure: true);

    if (result.Succeeded)
    {                                       
        var customClaims = new List<Claim>
        {
            new Claim(ClaimTypes.Role, Role.Admin)
        };

        var claimsIdentity = new ClaimsIdentity(customClaims, CookieAuthenticationDefaults.AuthenticationScheme);
        var claimsPrincipal = new ClaimsPrincipal(claimsIdentity);

        await _signInManager.Context.SignInAsync(IdentityConstants.ApplicationScheme,
            claimsPrincipal, new AuthenticationProperties { IsPersistent = loginModel.RememberMe });

        return LocalRedirect(returnUrl);
    }
    else if (result.IsLockedOut)
        ModelState.AddModelError(string.Empty, "This account has been locked out, please try again later.");
    else
        invalidLoginAttempt = true;
}
else
    invalidLoginAttempt = true;
0
Circuit Breaker