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 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:
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>();
Danke an Gevory. :)
Verwendung services.AddSingleton() anstelle von services.AddSingleton () –
Danke. Jetzt bin ich in der Lage, zum Handler zu kommen. Bist du in einer Chatgruppe? Habe dort einige Details geschickt. – Ray