【问题标题】:Restricting Azure AD users from accessing web api controller限制 Azure AD 用户访问 Web api 控制器
【发布时间】:2019-11-05 17:48:16
【问题描述】:

我有一个 web api 应用程序,我只允许授权用户访问。 我通过在控制器中使用属性 [Authorize] 来做到这一点

我是否可以限制具有给定用户名的特定用户访问应用程序,即使他/她在 Azure AD 中?

【问题讨论】:

    标签: azure asp.net-web-api2 azure-active-directory asp.net-core-webapi


    【解决方案1】:

    我是否可以限制具有给定用户名的特定用户访问应用程序,即使他/她在 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 用户访问 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 门户:

    1. 选择一个活动目录(例如默认目录)
    2. 点击[企业应用程序]
    3. 选择您要限制的应用程序(例如 AspNetCore-Quickstart)

    选择[Properties],将[User assignment required]更改为Yes

    选择[用户和组],根据需要添加/删除此应用程序的用户:

    注意 Azure AD 实际上是身份提供程序。此方法仅适用于整个应用程序。不允许某些用户访问应用程序但不允许他访问特定控制器而不编码/配置应用程序是不可能的。为此,我们别无选择,只能在应用程序内授权使用。

    【讨论】:

    • 谢谢!但是是否可以在不进行额外编码的情况下在 Azure AD 级别设置限制?否则我将不得不对我想要限制访问的用户名(或多个用户名)进行硬编码。
    • @amplifier 我更新了我的回复以显示一种可以限制整个应用程序级别的方法。但是请注意,不允许某些用户访问应用程序同时不允许他访问某些控制器而不在应用程序中进行编码/配置是不可能的。为此,我们别无选择,只能在应用程序中进行。这是因为 Azure AD 实际上是一个身份提供者。它只是向我们提供用户及其声明,授权用户的是我们的应用程序。
    猜你喜欢
    • 1970-01-01
    • 2018-02-08
    • 2021-03-16
    • 1970-01-01
    • 2016-01-04
    • 1970-01-01
    • 2015-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多