Ограничение доступа пользователей Azure AD к контроллеру веб-API - PullRequest
1 голос
/ 24 июня 2019

У меня есть приложение web api, доступ к которому разрешен только авторизованному пользователю.Я делаю это с помощью атрибута [Authorize] с контроллерами

Можно ли ограничить доступ к приложению для конкретного пользователя с данным именем пользователя, даже если он / она находится в Azure AD?

1 Ответ

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

Могу ли я ограничить доступ к приложению для конкретного пользователя с данным именем пользователя, даже если он / она находится в Azure AD?

Вам нужно создать политику и проверить текущего пользователя на соответствие этой политике в любое время.

Есть два способа сделать это.

  1. Используйте волшебную строку для настройки политики (например, [Authorize(policy="require_username=name")]), а затем создайте настраиваемый поставщик политики для динамического предоставления политики. Подробнее см. https://docs.microsoft.com/en-us/aspnet/core/security/authorization/iauthorizationpolicyprovider?view=aspnetcore-2.2
  2. Создайте статическую политику и используйте пользовательский AuthorizeFilter, чтобы проверить, разрешен ли текущий пользователь.

Поскольку этот поток спрашивает «Ограничение доступа пользователей Azure AD к контроллеру веб-API», я предпочитаю второй способ.

Вот реализация второго подхода. Во-первых, давайте определим политику requirename:

services.AddAuthorization(opts =>{
    opts.AddPolicy("requirename", pb => {
        pb.RequireAssertion(ctx =>{
            if(ctx.User==null) return false;
            var requiredName = ctx.Resource as string;    
            return ctx.User.HasClaim("name",requiredName);
        });
    });
});

И для проверки этой политики создайте пользовательский AuthorizeFilter, как показано ниже:

public class RequireNameFilterAttribute : Attribute, IAsyncAuthorizationFilter
{
    public string Name{get;set;}

    public RequireNameFilterAttribute(string name) { this.Name = name; }

    public async Task OnAuthorizationAsync(AuthorizationFilterContext context)
    {
        var user= context.HttpContext.User;
        if(user==null){
            context.Result = new ChallengeResult();
            return;
        }
        var authZService = context.HttpContext.RequestServices.GetRequiredService<IAuthorizationService>();
        var result= await authZService.AuthorizeAsync(user, this.Name, "requirename");
        if (!result.Succeeded) {
            context.Result = new ForbidResult();
        }
    }
}

Наконец, когда вы хотите запретить пользователям без требуемых имен, просто украсьте метод действия атрибутом RequireNameFilter(requiredName):

[RequireNameFilter("amplifier")]
public string Test()
{
    return "it works";
}

[Изменить]

AAD может ограничивать доступ пользователей Azure AD к веб-контроллеру API на уровне приложений. Но не может запретить пользователю доступ к API контроллера (уровень API).

Ниже приведены инструкции по ограничению пользователей Azure AD на уровне приложения.

Войдите в свой портал Azure:

  1. Выберите каталог действий (например, каталог по умолчанию)
  2. Нажмите [ Корпоративные приложения ]
  3. Выберите приложение, которое вы хотите ограничить (например, AspNetCore-Quickstart)

Выберите [ Свойства ], Измените [ Требуется назначение пользователя ] на Yes

enter image description here

Выберите [ Пользователи и группы ], Добавить / удалить пользователей для этого приложения по мере необходимости:

enter image description here

Имейте в виду, что Azure AD на самом деле является поставщиком удостоверений . Этот подход работает только для всего приложения . Невозможно разрешить некоторому пользователю доступ к Приложению, но запретить ему доступ к определенному контроллеру без кодирования / настройки Приложения. Для этого у нас нет выбора, кроме как разрешить использование в приложении.

...