ASP.NET Core 2 - группы AD не сопоставляются с ролями безопасности - PullRequest
0 голосов
/ 06 февраля 2019

Я получаю имя пользователя через User.Identity.Name, однако мне нужен способ ограничить доступ к определенным страницам через группы в Active Directory.

Например, «Администраторы домена» могут видеть все страницы.и «Просмотр пользователей» может видеть только целевую страницу и еще одну.

In Startup.cs

services.AddAuthentication(IISDefaults.AuthenticationScheme);

            services.AddAuthorization(options =>
            {
                options.AddPolicy("AdminRoleOnly", policy => policy.RequireRole(Configuration["SecuritySettings:AdminGroup"]));
            });

            services.AddMvc(config =>
            {
                var policy = new AuthorizationPolicyBuilder()
                    .RequireAuthenticatedUser()
                    .Build();

                config.Filters.Add(new AuthorizeFilter(policy));
            });

Конфиг:

  "SecuritySettings": {
    "AdminGroup": "MYDOMAIN\\Domain Admins"
  }

На моей модели страницы (У меня нет контроллеров):

[Authorize(Policy = "AdminRoleOnly")]
    public class RequestsModel : PageModel

Я просто получаю сообщение о том, что я не авторизован, несмотря ни на что

1 Ответ

0 голосов
/ 19 февраля 2019

В конце я сам написал обработчик (с помощью другого поста):

 public class CheckADGroupHandler : AuthorizationHandler<CheckADGroupRequirement>
    {
        protected override Task HandleRequirementAsync(AuthorizationHandlerContext context,
                                                       CheckADGroupRequirement requirement)
        {

        var groups = new List<string>();
        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)
                {
                    Console.WriteLine(e.ToString());
                }
            }

            foreach (string policygroup in requirement.GroupName)
            {

                if (groups.Contains(policygroup))
                {
                    context.Succeed(requirement);
                }
            }
        }

        return Task.CompletedTask;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...