繁体   English   中英

使用Azure AD身份验证的自定义授权

[英]Custom authorization with Azure AD authentication

我正在使用ASP.NET Core 2.0开发服务结构无状态Web应用程序。 此应用程序使用Azure AD对来自多个AD租户的用户进行身份验证。 我要实现的是使用自己的基于角色的授权,可以使用授权用户在我的应用程序中对其进行配置。 这些角色存储在我的应用程序中。

在当前的实现中,我通过使用自定义IAuthorizationRequirement添加策略来向应用程序添加授权。 在需求授权期间,根据用户权限添加声明。 这意味着声明将在登录后添加。 [Authorize(Roles = "role")]属性也不起作用,因为角色声明是在登录后添加的

使用来自Azure AD的经过身份验证的用户来实现此自定义授权的正确方法是什么?

您可以在用户通过OnTokenValidated事件OnTokenValidated后添加自己的自定义声明:

.AddOpenIdConnect(o =>
{
    Configuration.GetSection("OpenIdConnect").Bind(o);
    o.Events = new OpenIdConnectEvents
    {
        OnTokenValidated = async ctx =>
        {
            string oid = ctx.Principal.FindFirstValue("http://schemas.microsoft.com/identity/claims/objectidentifier");

            var db = ctx.HttpContext.RequestServices.GetRequiredService<AuthorizationDbContext>();

            var objectIdGuid = Guid.Parse(oid);
            bool isSuperAdmin = await db.SuperAdmins.AnyAsync(a => a.ObjectId == objectIdGuid);
            if (isSuperAdmin)
            {
                var claims = new List<Claim>();
                claims.Add(new Claim(ClaimTypes.Role, Roles.SuperAdmin));
                var appIdentity = new ClaimsIdentity(claims, "MyTestAppIdentity");

                ctx.Principal.AddIdentity(appIdentity);
            }
        }
    };
});

作为示例,我们从数据库中检查用户是否为超级管理员。 如果是这样,我们将为他们创建一个新的身份,并以必要的角色作为声明。

所有身份在主体上组合在一起以生成其索赔集,因此所有其他索赔也将仍然可用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM