Как ASP. NET Роли используются с Авторизацией? - PullRequest
0 голосов
/ 27 января 2020

Я использую ASP. NET Ядро и хостинг, что в основном является шаблоном по умолчанию с включенной Windows Аутентификацией. Я размещаю это на выделенном сервере IIS и проверил, что приложение получает правильную информацию от AD, и оно правильно аутентифицирует мою сессию.

Мне кажется, что я пытаюсь сделать что-то очень простое. Если пользователь находится в группе безопасности (из AD) «Администратор», он может получить доступ к определенной функции c. Если они не входят в эту группу, они не получают доступ.

Я добавил атрибут [Authorize] для службы

(in ConfigureServices)
services.AddAuthentication(IISDefaults.AuthenticationScheme);
(in Configure)
app.UseAuthorization();

(in service)
[Authorize]
public class SiteService
    {
        private readonly string _route;
        private readonly HttpClient _httpClient;

        public SiteService(HttpClient httpClient)
        {
            _httpClient = httpClient;
            _route = httpClient.BaseAddress.AbsoluteUri;
        }

        public async Task<IEnumerable<Site>> GetSites()
        {

        }
   }

. Я вижу в журналах, которые обращаются к службе. дает мне домен / пользователя. Затем я посмотрел документы MS здесь: https://docs.microsoft.com/en-us/aspnet/core/security/authorization/roles?view=aspnetcore-3.1

И включил [Authorize (Roles = "Admin"). Это сработало. Затем я переключил «Admin» на «sldkfjslksdlfkj». Ничего не изменилось ... Я все еще могу получить доступ к услуге.

Почему проверка Roles = "x" не работает? Как включить относительно простую проверку AD для группы безопасности?

1 Ответ

1 голос
/ 28 января 2020

Вы можете написать пользовательских обработчиков политик авторизации , чтобы проверить все группы AD пользователей и проверить, содержат ли они нужное имя группы.

См. Следующее:

1.Создать CheckADGroupRequirement (принять параметр)

    public class CheckADGroupRequirement : IAuthorizationRequirement
    {
        public string GroupName { get; private set; }

        public CheckADGroupRequirement(string groupName)
        {
            GroupName = groupName;
        }
    }

2.Создать CheckADGroupHandler

    public class CheckADGroupHandler : AuthorizationHandler<CheckADGroupRequirement>
    {
        protected override Task HandleRequirementAsync(AuthorizationHandlerContext context,
                                                       CheckADGroupRequirement requirement)
        {
            //var isAuthorized = context.User.IsInRole(requirement.GroupName);

            var groups = new List<string>();//save all your groups' name
            var wi = (WindowsIdentity)context.User.Identity;
            if (wi.Groups != null)
            {
                foreach (var group in wi.Groups)
                {
                    try
                    {
                        groups.Add(group.Translate(typeof(NTAccount)).ToString());
                    }
                    catch (Exception e)
                    {
                        // ignored
                    }
                }
               if(groups.Contains(requirement.GroupName))//do the check
                {
                    context.Succeed(requirement);
                }
            }

            return Task.CompletedTask;
        }
    }

3. Зарегистрировать обработчик в ConfigureServices

    services.AddAuthorization(options =>
    {
        options.AddPolicy("AdminOnly", policy =>
            policy.Requirements.Add(new CheckADGroupRequirement("DOMAIN\\Domain Admin")));//set your desired group name
            //other policies
    });

    services.AddSingleton<IAuthorizationHandler, CheckADGroupHandler>();

4. Использование на контроллере / сервисе

    [Authorize(Policy = "AdminOnly")]
    public class SiteService
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...