2016-10-16 2 views
0

Ich erstelle Richtlinienbasisberechtigungen und möchte mehreren Benutzern in einer Richtlinie den Zugriff auf die Webseite ermöglichen.ASP.NET Core-Richtlinienbasis Autorisieren mit RequireUser mit Zeichenfolgenarray

Ich erstellte Richtlinie wie unten in der Startdatei gezeigt. Frage, Wie kann ich mehrere Benutzernamen in einer Richtlinie verwenden? Ich schaute auf die Methode für .RequireUserName, es akzeptiert nur Zeichenfolge Benutzernamen.

Policy Name AdminServiceAccount ist vor allem interessiert mich, mehrere Benutzer hinzuzufügen. Wenn ich param .RequireUserName("DOMAIN\\USER1,DOMAIN\\USER2") benutze es funktioniert? Ich denke nicht, aber ich wollte prüfen, ob es einen alternativen Weg gibt.

services.AddAuthorization(
       option => 
       { 
        option.AddPolicy("Admin", policy => policy.RequireRole("Domain\\GroupName")); 
        option.AddPolicy("SuperAdminUser", policy => policy.RequireUserName("DOMAIN\\SuperAdminUser")); 
        option.AddPolicy("AdminServiceAccount", policy => policy.RequireUserName("DOMAIN\\USER1")); 
       } 
     ); 

UPDATE 1: enter image description here

UPDATE 2:

Also in meinem Controller ich [Authorize(Policy = "UserNamesPolicy")] wie unten gezeigt hinzugefügt:

[Authorize(Policy = "UserNamesPolicy")] 
public class ServersController : Controller 
{ 
    private readonly ServerMatrixDbContext _context; 

    public ServersController(ServerMatrixDbContext context) 
    { 
     _context = context;  
    } 

    // GET: Servers 
    public async Task<IActionResult> Index() 
    { 
     // Some code here 
     return View(); 
    } 
} 

Hier ist mein Start Datei:

services.AddAuthorization(
       option => 
       { 
        option.AddPolicy("UserNamesPolicy", 
              policy => policy.Requirements.Add(new UserNamesRequirement("DOMAIN\\USER1", "DOMAIN\\USER2")) 
        ); 
       } 
     ); 
services.AddSingleton<IAuthorizationHandler, UserNamesRequirement(); 

Für .AddSingleTon in Startdatei I unten Fehlermeldung erhalten:

enter image description here

Hier ist die handler Klasse:

public class UserNamesHandler : AuthorizationHandler<UserNamesRequirement> 
{ 

    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, UserNamesRequirement requirement) 
    { 
     var userName = context.User.FindFirst(ClaimTypes.NameIdentifier).Value; 

     if (requirement.Users.ToList().Contains(userName)) 
      context.Succeed(requirement); 
     return Task.FromResult(0); 
    } 
} 

Hier ist die UserNamesRequirement Klasse:

public class UserNamesRequirement : IAuthorizationRequirement 
{ 
    public UserNamesRequirement(params string[] UserNames) 
    { 
     Users = UserNames; 
    } 
    public string[] Users { get; set; } 
} 

UPDATE 3: Gelöst !!!!

Hier sind einige Änderungen, die von Update 2 hinzugefügt wurden:

In UserNameshandler Klasse geändert var username zu erhalten Werte von context.User.Identity.Name;

public class UserNamesHandler : AuthorizationHandler<UserNamesRequirement> 
{ 

    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, UserNamesRequirement requirement) 
    { 
     // var userName = context.User.FindFirst(ClaimTypes.NameIdentifier).Value; 
     var userName = context.User.Identity.Name; 

     if (requirement.Users.ToList().Contains(userName)) 
      context.Succeed(requirement); 
     return Task.FromResult(0); 
    } 
} 

In StartUp Klasse services.AddSingleton<IAuthorizationHandler, UserNamesRequirement>();-services.AddSingleton<IAuthorizationHandler,UserNamesHandler>();

Fest

Danke an Gevory. :)

+1

Verwendung services.AddSingleton () anstelle von services.AddSingleton () –

+0

Danke. Jetzt bin ich in der Lage, zum Handler zu kommen. Bist du in einer Chatgruppe? Habe dort einige Details geschickt. – Ray

Antwort

3
public class UserNamesHandler : AuthorizationHandler<UserNamesRequirement> 
{ 

    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, UserNamesRequirement requirement) 
    { 
     var userName = context.User.Identity.Name; 

     if(requirement.UserNames.ToList().Contains(userName)) 
      context.Succeed(requirement); 
     return Task.CompletedTask; // if it does not compile use Task.FromResult(0) 
    } 
} 

public class UserNamesRequirement : IAuthorizationRequirement 
{ 
    public UserNamesRequirement(params string[] UserNames) 
    { 
     UserNames = UserNames; 
    } 

    public string[] UserNames { get; set; } 
} 

in startup.cs hinzufügen

public void ConfigureServices(IServiceCollection services) 
{ 
      services.AddAuthorization(options => 
      { 
       options.AddPolicy("UserNamesPolicy", 
            policy => policy.Requirements.Add(new UserNamesRequirement("ggg","dsds"))); 
      }); 
      services.AddSingleton<IAuthorizationHandler, UserNamesHandler>() 

} 
+0

Vielen Dank für die Zeit für diesen tollen Code. :) Ich bekomme in 'UserNameHandler' Klasse' CompletedTask ist nicht in Task'. Ich habe meine Abfrage mit Screenshot mit Fehler aktualisiert, den ich bekomme. – Ray

+0

können Sie Task verwenden.FromResult (0) dann –

+0

@Ray Ich benutze asp.net Kern, so kann es einige kleine Unterschiede geben, wenn Sie einige andere Fehler bekommen, lassen Sie mich wissen –

Verwandte Themen