我有一个Web API应用程序,仅允许授权用户访问。 我通过对控制器使用[Authorize]属性来实现
我能否限制具有给定用户名的特定用户访问应用程序,即使该用户位于Azure AD中?
答案 0 :(得分:1)
是否可以限制具有给定用户名的特定用户访问应用程序,即使该用户位于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用户访问Web 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)
属性修饰action方法即可:
[RequireNameFilter("amplifier")]
public string Test()
{
return "it works";
}
[编辑]
AAD可以限制Azure AD用户在应用程序级别访问Web api控制器。但是不能禁止用户访问Controller API(API级别)。
这是在应用程序级别限制Azure AD用户的方法
登录您的Azure门户:
选择[属性],将[需要用户分配]更改为Yes
选择[用户和组],根据需要添加/删除此应用程序的用户:
请注意,Azure AD实际上是身份提供者。这种方法仅适用于整个应用程序。不允许某些用户访问该应用程序但不允许他在不对应用程序进行编码/配置的情况下访问特定的控制器是不可能的。为此,我们只能在应用程序内授权使用。