【问题标题】:Authorization and Authentication for Azure AD in .netcore app.netcore 应用中 Azure AD 的授权和身份验证
【发布时间】:2019-11-16 00:28:23
【问题描述】:

我正在开发一个 .netcore 2.1 api 应用程序,它尝试使用 On Behalf Of Flow 访问 Graph api。

我对下面的代码有一个大致的了解,就像它用于代表用户身份验证一样。 但是有人可以逐行解释它的含义或任何有助于我理解授权和身份验证选项的文档吗?

    services.AddMvc(o =>
            {
                o.Filters.Add(new AuthorizeFilter("default"));
            });
            services.AddAuthorization(o =>
            {
                o.AddPolicy("default", builder =>
                {
                    builder
                        .RequireAuthenticatedUser()
                        .RequireClaim(AzureAdClaimTypes.Scope, 
    "user_impersonation");
                });
            });

            services
                .AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
                .AddJwtBearer(o =>
                {
                    AuthenticationOptions authSettings = Configuration.GetSection("Authentication").Get<AuthenticationOptions>();

                    o.Authority = authSettings.Authority;

                    o.SaveToken = true;

                    o.TokenValidationParameters = new TokenValidationParameters
                    {
                        ValidAudiences = new List<string> { authSettings.ClientId, authSettings.AppIdUri }
                    };
                });

【问题讨论】:

    标签: .net-core oauth-2.0 azure-active-directory


    【解决方案1】:
    services.AddMvc(o =>
    {
            o.Filters.Add(new AuthorizeFilter("default"));
    });
    

    添加一个适用于所有 MVC 控制器和操作的全局过滤器。 在这种情况下,它需要使用“默认”策略进行授权。

    services.AddAuthorization(o =>
    {
         o.AddPolicy("default", builder =>
         {
                builder
                      .RequireAuthenticatedUser()
                      .RequireClaim(AzureAdClaimTypes.Scope, 
        "user_impersonation");
         });
    });
    

    定义“默认”授权策略。 要求身份验证成功并且调用者具有默认的 user_impersonation 范围。 因此,需要将此范围/委派权限授予调用应用程序。 检查是否存在委托/应用程序权限非常重要。 这就是这样做的,尽管如果您定义了超过 1 个委派权限 + 已授予,则它不起作用,因为声明将在一个字符串中包含所有这些权限。 如果需要,您可以使用声明转换来拆分它们。

    services
        .AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    

    添加身份验证服务并将 JWT 身份验证定义为默认值。

        .AddJwtBearer(o =>
        {
               AuthenticationOptions authSettings = Configuration.GetSection("Authentication").Get<AuthenticationOptions>();
    

    添加 JWT 认证方案服务并获取配置对象。

    o.Authority = authSettings.Authority;
    

    设置权限。此 URL 用于在应用启动时获取身份提供者元数据 JSON 文档。 然后该文件具有例如有效的颁发者 URI 和签名密钥。 所以基本上它是用来加载令牌验证数据的。

    o.SaveToken = true;
    

    将收到的访问令牌保存到请求中,以便在请求期间可以从您需要的任何地方访问它们。 您需要使用 OBO 进行此操作,因为您需要将收到的此令牌与其他数据一起发送以获取另一个令牌。

    o.TokenValidationParameters = new TokenValidationParameters
    {
          ValidAudiences = new List<string> { authSettings.ClientId, authSettings.AppIdUri }
    };
    

    定义此 API 接受两种不同的受众。 这是 AAD 的一个很好的做法。 我有时在 aud 声明中看到带有客户端 ID 的令牌,有时它是应用 ID URI。 所以最好两者都允许。 但是定义这些也意味着 API 不会接受用于另一个 API 的令牌,这很好。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-19
    • 1970-01-01
    • 1970-01-01
    • 2022-09-23
    • 1970-01-01
    • 2021-12-03
    相关资源
    最近更新 更多