【发布时间】:2019-11-05 17:48:16
【问题描述】:
我有一个 web api 应用程序,我只允许授权用户访问。 我通过在控制器中使用属性 [Authorize] 来做到这一点
我是否可以限制具有给定用户名的特定用户访问应用程序,即使他/她在 Azure AD 中?
【问题讨论】:
标签: azure asp.net-web-api2 azure-active-directory asp.net-core-webapi
我有一个 web api 应用程序,我只允许授权用户访问。 我通过在控制器中使用属性 [Authorize] 来做到这一点
我是否可以限制具有给定用户名的特定用户访问应用程序,即使他/她在 Azure AD 中?
【问题讨论】:
标签: azure asp.net-web-api2 azure-active-directory asp.net-core-webapi
我是否可以限制具有给定用户名的特定用户访问应用程序,即使他/她在 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 控制器。但不能禁止用户访问控制器 API(API 级别)。
以下是有关在应用程序级别限制 Azure AD 用户的方法
登录您的 Azure 门户:
选择[Properties],将[User assignment required]更改为Yes
选择[用户和组],根据需要添加/删除此应用程序的用户:
注意 Azure AD 实际上是身份提供程序。此方法仅适用于整个应用程序。不允许某些用户访问应用程序但不允许他访问特定控制器而不编码/配置应用程序是不可能的。为此,我们别无选择,只能在应用程序内授权使用。
【讨论】: