1

Zur Zeit habe ich ein einfachen benutzerdefinierten Richtlinien-Handler, der wie so aussieht:Wie behalte Richtlinienautorisierungsergebnisse für Benutzer in ASP.NET Core, MVC 6?

protected override void Handle(AuthorizationContext context, UserPolicyRequirement requirement) 
{ 
    // authorize user against policy requirements 
    if (_authorizationTask.AuthorizeUserAgainstPolicy(context.User, requirement)) 
    { 
     // User passed policy req's 
     context.Succeed(requirement); 
    } 
} 

Problem ist, dieser Autorisierungsschritt dauert eine lange Zeit ausgeführt werden, aber dies wird in vielen verschiedenen Bereichen der Website erforderlich. Gibt es Mechanismen zum Speichern/Zwischenspeichern der Ergebnisse dieser Richtlinienautorisierung, so dass ich dies nur einmal pro Sitzung durchführen muss?

Ich verwende derzeit Windows-Authentifizierung, wenn das hilft.

Antwort

2

Wenn per session Weg kein Problem verursacht, können Sie Session verwenden, um Benutzerdaten zu speichern. Einfache Implementierung ist so etwas wie unten:

Zuerst Sie einen Service benötigen Benutzerdaten von jedem Geschäft

public interface IGetUserDataService 
{ 
    <type> GetUserData(); 
} 

Ich gehe davon zu bekommen, dass es Session Konfiguration (see) und IGetUserDataService Umsetzung.

Dann brauchen Sie ein erstellen middlewareSession

public class SessionMiddleware 
{ 
    private readonly RequestDelegate _next; 
    private readonly IGetUserDataService _getUserDataService; 

    public SessionMiddleware(RequestDelegate next, IGetUserDataService getUserDataService) 
    { 
     _next = next; 
     _getUserDataService = getUserDataService; 
    } 

    public async Task Invoke(HttpContext context) 
    { 
     //user data is obtained only once then is stored in Session 
     if (context.Session.Get("UserData") == null) 
     { 
      context.Session.Set("UserData", getUserDataService.GetData()); 
     } 
     await _next.Invoke(context); 
    } 
} 

//In Startup.cs 
app.UseMiddleware<SessionMiddleware>(); 

Schließlich zu behandeln bekommen und Sitzungsdaten in Handler

public class YourHandler : AuthorizationHandler<YourRequirement> 
{ 
    private readonly IHttpContextAccessor _accessor; 
    public YourHandler(IHttpContextAccessor accessor) 
    { 
     _accessor = accessor; 
    } 
    protected override void Handle(AuthorizationContext context, PermissionRequirement requirement) 
    { 
     var userData =(<type>)_accessor.HttpContext.Session.Get("UserData"); 
     // check 
    } 
} 
+0

verwendet nicht die Session.Set nur Byte-Array akzeptieren, nicht widersprechen? – painiyff

+0

Egal, ich konvertierte Objekt in JSON-String stattdessen: [linky] (http://stackoverflow.com/questions/35993415/asp-net-5-core-how-to-store-objects-in-session-cache- Ission) – painiyff