Могу ли я ограничить доступ к приложению для конкретного пользователя с данным именем пользователя, даже если он / она находится в Azure AD?
Вам нужно создать политику и проверить текущего пользователя на соответствие этой политике в любое время.
Есть два способа сделать это.
- Используйте волшебную строку для настройки политики (например,
[Authorize(policy="require_username=name")]
), а затем создайте настраиваемый поставщик политики для динамического предоставления политики. Подробнее см. https://docs.microsoft.com/en-us/aspnet/core/security/authorization/iauthorizationpolicyprovider?view=aspnetcore-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:
- Выберите каталог действий (например, каталог по умолчанию)
- Нажмите [ Корпоративные приложения ]
- Выберите приложение, которое вы хотите ограничить (например, AspNetCore-Quickstart)
Выберите [ Свойства ], Измените [ Требуется назначение пользователя ] на Yes

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

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