Комплексная роль авторизации Asp.net ядро ​​MVC - PullRequest
1 голос
/ 21 июня 2019

Я написал следующий код для обработки авторизации. Предоставление доступа или отсутствие доступа может быть достигнуто с помощью атрибута authorize. У меня такой вопрос: существует ли стандартный способ обработки частичного доступа, когда некоторые пользователи имеют доступ ко всему, а некоторые - к небольшим ресурсам на основе роли, как показано в операторе if ниже? Запись если еще блок , как показано ниже везде, мне не кажется правильным? Пожалуйста, предложите, если есть лучший способ сделать это.

 [Authorize(Roles ="admin,superadmin")]
   public async Task<IActionResult> Index()
   {
           if (User.IsInRole("superadmin"))
            {
                //get all groups
            }
            else
            {
              //get only groups that the user belong to
            }

   }

Обновлено (решение) на основе этого обсуждения: я добавил следующий код для обработки моего сценария. Любые комментарии или предложения приветствуются.

public class SuperAdminUsersRequirement : IAuthorizationRequirement
    {
        public SuperAdminUsersRequirement(params string[] roles)
        {
            AllowedRoles = roles;
        }
        public string[] AllowedRoles { get; set; }
    }
    public class SuperAdminAuthorizationHander : AuthorizationHandler<SuperAdminUsersRequirement>
    {
        protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, SuperAdminUsersRequirement requirement)
        {
            if(UserIsAllowed(context, requirement))
            {
                context.Succeed(requirement);
            }
            else
            {
                context.Fail();
            }
            return Task.CompletedTask;
        }

        private bool  UserIsAllowed(AuthorizationHandlerContext context, SuperAdminUsersRequirement requirement)
        {
            if (context.User.Claims != null)
            {
                var claims = from userClaims in context.User.Claims
                             where userClaims.Type == ClaimTypes.Role
                             select userClaims.Value;
                if (requirement.AllowedRoles.Intersect(claims, StringComparer.OrdinalIgnoreCase).Any())
                {
                    return true;
                }
                else
                {
                    return false;
                }

            }
            else
            {
                return false;
            }
        }
    }

startup.cs: можно настроить для добавления дополнительных ролей, имеющих полный доступ

services.AddAuthorization(options =>
            {
                options.AddPolicy("HasAllAccess", policy =>
                    policy.Requirements.Add(new SuperAdminUsersRequirement(AdminRole.SUPER_ADMIN.ToString()
                        )));
            });

controller.cs

var authorizationResult = await _authorizationService.AuthorizeAsync(User, "HasAllAccess");

 if(authorizationResult.Succeeded)
            {
 //fetch everything
    }
else
{
  // fetch partial data
}

1 Ответ

1 голос
/ 24 июня 2019

Существует множество примеров кода, доступных для Ресурсная авторизация в ASP.NET Core :

https://andrewlock.net/resource-specific-authorisation-in-asp-net-core/

https://github.com/MicrosoftDocs/architecture-center/blob/master/docs/multitenant-identity/authorize.md

Для вашего требования измените функцию HandleRequirementAsync в AuthorizationHandler, которая наследуется от AuthorizationHandler<YourRequirement, ResourceName>, вы должны проверить, есть ли у пользователя правильные роли / роли на основе вашего требования:

if (context.User.HasClaim(ClaimTypes.Role, Roles.SurveyAdmin))
{
    context.Succeed(requirement);
    return Task.FromResult(0);
}

Или:

if (context.User.IsInRole("super_user"))
{
    context.Succeed(requirement);
    return Task.FromResult(0);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...