ASP. NET Core 3.1 - доступ запрещен - PullRequest
0 голосов
/ 25 апреля 2020

Я довольно новичок в ASP. NET Core 3.1 Razor Pages, и у меня есть вопрос. Надеюсь, вы сможете помочь мне в дальнейшем :).

Я хочу иметь приложение с Windows AD Security. Описание того, что я хочу сделать:

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

У меня проблема в следующем. В LaunchSettings. json я поместил этот код:

    "windowsAuthentication": true,
    "anonymousAuthentication": false,
    "iisExpress": {
      "applicationUrl": "http://localhost:65385",
      "sslPort": 44356
    }
  } 

Затем в Startup.cs я добавил AddAuthentication.

    public void ConfigureServices(IServiceCollection services)
    {
      services.AddAuthentication(IISDefaults.AuthenticationScheme);
      services.AddRazorPages();
    }

И в части Configure:

      app.UseAuthentication();
      app.UseAuthorization();

Затем, наконец, я создал отдельную папку, называемую Admin, в моей папке Pages. Я хочу ограничить эту папку только для группы администраторов. Поэтому я добавил Авторизацию в Index1Model.

  [Authorize(Roles = "Administrators")]
  public class Index1Model : PageModel
    {
        public void OnGet()
        {
        }
    }

При локальном запуске этого кода с IIS Express и нажатии защищенной страницы я получаю следующую ошибку:

Access denied

Я думал это может быть связано с подражанием. Но когда я включаю это в IIS, я больше не могу открыть приложение. Пользователь, который отображается в верхнем углу моей программы, находится в группе администраторов, и поэтому ему должно быть разрешено видеть страницу. Что я пропускаю? Спасибо за помощь!

Ответы [ 2 ]

0 голосов
/ 26 апреля 2020

Насколько я знаю, windows аутентификация будет просто проверять, аутентифицирован ли пользователь или нет. Он не обеспечит никакого контроля на основе ролей в приложении MVC.

Таким образом, ваш атрибут Authorize будет бесполезен.

Чтобы получить авторизацию на основе ролей AD, я предлагаю вам рассмотреть возможность использования авторизации на основе политик для аутентификации только пользователей из группы Active Directory, имеющих доступ к стр. Deals, вы можете обратиться к article .

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

Подробнее подробности, вы можете обратиться к следующим шагам:

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

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

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

2. Создать обработчик

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("ADRoleOnly", policy =>
        policy.Requirements.Add(new CheckADGroupRequirement("DOMAIN\\Domain Admin")));
});

services.AddSingleton<IAuthorizationHandler, CheckADGroupHandler>();

4.Controller

[Authorize(Policy = "ADRoleOnly")]
 public class ADController : Controller
0 голосов
/ 25 апреля 2020

Вы включили windows аутентификацию в IIS? Если нет, попробуйте анонимную аутентификацию, и где-нибудь на вашей странице отобразится пользователь и его роли, чтобы вы могли видеть, какая личность проходит через IIS. Возможно, вам придется изменить удостоверение, под которым работает пул приложений, но я уверен, что это как-то связано с вашей конфигурацией IIS.

...