.netcore应用中的Azure AD的授权和身份验证

时间:2019-07-05 11:09:27

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

我正在开发一个.netcore 2.1 api应用程序,该应用程序尝试使用“代表流量”访问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 }
                    };
                });

1 个答案:

答案 0 :(得分:0)

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的令牌,这很好。