Как создать политику авторизации для анонимных пользователей

#.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()));
          
  });
}
 

Обратите внимание, что эта политика будет ЗАПРЕЩАТЬ пользователю, прошедшему проверку подлинности, поэтому она полезна только в текущем состоянии для конкретной целевой аудитории анонимных пользователей.