#.net-core #authorization
Вопрос:
С .NET Core 5 — Насколько я понимаю, каждому пользователю (независимо от того, вошли ли они в систему) присваивается идентификатор. Таким образом, по умолчанию будет назначен анонимный пользователь Identity.User.IsAuthenticated == false
.
Я не могу понять, как выразить это в виде политики. Кто-нибудь знает, как создать политику авторизации для представления этих анонимных пользователей?
public static void AddAuthorizationAndPolicies(this IServiceCollection services)
{
services.AddAuthorization(options =>
{
//Policy for logged in user - straightforward
options.AddPolicy("IsLoggedIn",
policy => policy.RequireAuthenticatedUser());
//Policy for admin user - straightforward
options.AddPolicy("IsAdminUser",
policy => policy.RequireRole("Admin"));
//policy for Anonymous users - *** How to do this ***?
options.AddPolicy("IsAnonymousUser",
policy => policy.AddRequirements()); //???
});
}
Ответ №1:
Хорошо, похоже, что один из способов сделать это-создать пользовательский класс требований к авторизации, а затем создать политику, которая его использует.
Чтобы создать пользовательский класс авторизации (в данном случае с именем «AllowAnonymousAuthorizationRequirement»)…
public class AllowAnonymousAuthorizationRequirement:
AuthorizationHandler<AllowAnonymousAuthorizationRequirement>, IAuthorizationRequirement
{
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, AllowAnonymousAuthorizationRequirement requirement)
{
var user = context.User;
var userIsAnonymous = user?.Identity == null || !user.Identities.Any(i => i.IsAuthenticated);
//success is user IS anonymous
if (userIsAnonymous)
{
context.Succeed(requirement);
}
return Task.CompletedTask;
}
}
А затем добавьте политику, в которой используется новое пользовательское требование…
public static void AddAuthorizationAndPolicies(this IServiceCollection services)
{
services.AddAuthorization(options =>
{
options.AddPolicy("IsAnonymousUser",
policy => policy.AddRequirements( new AllowAnonymousAuthorizationRequirement()));
});
}
Обратите внимание, что эта политика будет ЗАПРЕЩАТЬ пользователю, прошедшему проверку подлинности, поэтому она полезна только в текущем состоянии для конкретной целевой аудитории анонимных пользователей.