Laden...

ASP Core Windows Authentifizierung + ClaimsTransformation + lokale Benutzerdatenbank

Erstellt von lomex vor 4 Jahren Letzter Beitrag vor 4 Jahren 935 Views
L
lomex Themenstarter:in
6 Beiträge seit 2008
vor 4 Jahren
ASP Core Windows Authentifizierung + ClaimsTransformation + lokale Benutzerdatenbank

Hallo,

ich entwickel gerade eine Webanwendung mit ASP Core (Razor Pages, aktuelle Version) und möchte (muss) die rollenbasierte Authentifizierung in Verbindung mit einer Windows Authentifizierung nutzen.

Was bislang funktioniert:
Beim Start der Anwendung weise ich per ClaimsTransformer der aktuellen Identität (die von der Windows Authentifizierung) manuell eine Rolle zu. Diese Rolle kann ich nun in der ganzen Anwendung verwenden.

Nun möchte ich jedoch diese Rolle nicht manuell setzen, sondern die Rolle aus der eigenen Benutzer-Datenbank nehmen. Und wenn die Rolle des eigenen Benutzers geändert wird, soll ebenfalls die Rolle der Identität angepasst werden.

  • Über HttpContext.AuthenticateAsync() soll der ClaimsTransformer angeblich automatisch "angestoßen" werden. Leider bekomme ich nur Laufzeitfehler mit diesem Befehl. *Versuche im im ClaimsTransformer (Singleton) einen Service oder den DatenbankContext im Constructor unterzubringen, bekomme ich immer einen 500er Fehler.
  1. Wie komme ich im ClaimsTransformer an den aktuellen Benutzer aus der Datenbank?
  2. Wie kann ich zur Laufzeit die Identität ändern? Also alle Claims löschen, die aktuelle Rolle neu zuweisen?

Meine startup.cs:


services.AddAuthentication();
services.AddSingleton<IClaimsTransformation, ClaimsTransformer>();

ClaimsTransformer.cs


using System.Security.Claims;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authentication;
using Microsoft.EntityFrameworkCore;
using VerMi.Services;
using VerMi.Models;

namespace VerMi.Authentication
{

    public class ClaimsTransformer : IClaimsTransformation
    {

        public ClaimsTransformer()
        {
        
        }

        public Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal)
        {

            var ci = (ClaimsIdentity)principal.Identity;
            var c = new Claim(ci.RoleClaimType, "Admin");
            ci.AddClaim(c);
            return Task.FromResult(principal);
        }
    }

}

16.807 Beiträge seit 2008
vor 4 Jahren

Zu HTTP 500 Fehlermeldungen gibt es immer eine Exception, die man sich anschauen kann.
Ohne Exception kann man Dir an dieser Stelle auch nicht helfen - haben keine Glaskugel.

PS: Es sollte niemals etwas als Singleton registriert werden, wo ein HTTP Context oder eine Datenbank-Verbindung im Spiel ist (außer alle Parameter werden über die Methode übergeben, nicht über die Instanz-Erstellung.

PPS: Deine Namespaces entsprechen nicht den Microsoft Empfehlungen und wird Dir bei einer Modularisierung weh tun.

  1. Wie komme ich im ClaimsTransformer an den aktuellen Benutzer aus der Datenbank?

Du hast die Identität; aus der Datenbank musst selbst laden.

  1. Wie kann ich zur Laufzeit die Identität ändern? Also alle Claims löschen, die aktuelle Rolle neu zuweisen?

Das hört sich nicht sinnvoll an. Was hast Du vor?