2016-04-12 11 views
0

Ich habe erfolgreich Windows-Authentifizierung in meinem Intranet ASP.NET Core 1.0 Web App implementiert und der Benutzername ist über User.Identity.Name in meinem Controller in Form von DOMAIN\user. Ich benutze auch Entity Framework Core.So legen Sie meine Benutzerinformationen global einmal authentifiziert

Was ich tun möchte, ist, um zusätzliche Benutzerinformationen, die ich von meiner SQL Server-Datenbank für diese DOMAIN\user haben, und haben dies auf eine globale Weise gespeichert. Ich könnte einen Cookie-Wert über HttpContext.Session auf jeder Controller-Aktion setzen und überprüfen, aber ich würde eine globale Methode bevorzugen. Wie könnte ich das tun?

+1

Sie haben nichts über die Art oder Größe der Benutzerdaten erwähnt, die Sie zur Verfügung stellen möchten, aber für kleine Datenelemente über den Benutzer können Sie benutzerdefinierte Ansprüche hinzufügen, indem Sie eine benutzerdefinierte Claims Principalfactory implementieren oder Schadentransformationen verwenden. Dann können Sie leicht die Ansprüche des aktuellen Benutzers überprüfen –

+0

Ich werde höchstwahrscheinlich einen einzelnen Zeilenwert zurückgeben – Francis

+0

Ich bin in der Lage, einen Anspruch auf den Anspruchsprinzip hinzuzufügen, aber die Daten bestehen nicht. Ich werde bis RC2 warten, da die Windows-Authentifizierung noch nicht vollständig integriert ist. [Github-Ausgabe 1232] (https://github.com/aspnet/Home/issues/1232) – Francis

Antwort

0

Wir tun dies durch "Anreichern" des angemeldeten Benutzers mit zusätzlichen Informationen zu jeder Anfrage mit claims und middleware. Für die Aufzeichnung verwenden wir Cookie-Authentifizierung, aber ich denke nicht, dass es wichtig ist.

Hier unser Ansatz ist:

  1. eine middleware Klasse erstellen, die als Einstiegspunkt zum Abrufen von nicht-beharrte claims, dh Forderungen, die wir bei der Speicherung in unserem Cookie nicht interessiert dienen werden, und in Ihrem Fall Ansprüchen, die werden nicht automatisch über die Windows-Authentifizierung initialisiert.
  2. Lassen Sie die middleware einige zusätzliche Informationen erfassen und sie dem aktuellen Benutzer basierend auf der Benutzer-ID hinzufügen. Im folgenden Beispiel verwenden wir eine Vielzahl von IMyClaimProvider s, um zusätzliche claims für den aktuellen Benutzer abzurufen.

    using System.Collections.Generic; 
    using System.Security.Claims; 
    using System.Threading.Tasks; 
    using Microsoft.AspNet.Builder; 
    using Microsoft.AspNet.Http; 
    
    class UserClaimsMiddleware 
    { 
        private readonly RequestDelegate _next; 
    
        public UserClaimsMiddleware(RequestDelegate next) 
        { 
         _next = next; 
        } 
    
        public async Task Invoke(HttpContext httpContext, IEnumerable<IMyClaimProvider> claimProviders) 
        { 
         foreach (var claimProvider in claimProviders) 
         { 
          var identity = (ClaimsIdentity) httpContext.User.Identity; 
          var identifier = identity.FindFirst(ClaimTypes.NameIdentifier).Value; 
          var claims = claimProvider.GetNonPersistentClaims(identifier); 
          identity.AddClaims(claims); 
         } 
         await _next(httpContext); 
        } 
    } 
    
  3. Wie Sie sich entscheiden, zusätzliche Informationen zu holen, liegt ganz bei Ihnen. In unserem Fall ist die System.Security.Claims.ClaimTypes.NameIdentifier einfach eine GUID, die eine Zeile in einer Datenbank identifiziert, und diese Zeile enthält grundlegende Informationen wie Vorname, Nachname, Adresse und E-Mail, die wir als eine Sammlung von Ansprüchen zurückgeben.

    interface IMyClaimProvider 
    { 
        IEnumerable<Claim> GetNonPersistentClaims(string nameIdentifier); 
    } 
    
  4. Registrieren Sie die Middleware beim Start der Anwendung. Die Reihenfolge der Middleware ist wichtig! Unsere benutzerdefinierte Middleware muss nach die Middleware für die Authentifizierung registriert werden.

    public void Configure(IHostingEnvironment environment, IApplicationBuilder application, ILoggerFactory loggerfactory) 
    { 
        application.UseIISPlatformHandler(); 
        application.UseStaticFiles(); 
        [...] 
        application.UseMiddleware<UserClaimsMiddleware>(); 
        [...] 
    } 
    
0

habe ich @Uli ‚s Antwort nicht versucht, aber der zweite Teil this post hat mir geholfen, den vollständigen Namen aus dem Anspruch Rücken des Benutzers zu erhalten.

Verwandte Themen