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

Wou*_*r B 2 asp.net authorization azure-active-directory azure-service-fabric asp.net-core-2.0

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

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

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

juu*_*nas 5

用户通过事件登录后,您可以添加自己的自定义声明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);
            }
        }
    };
});
Run Code Online (Sandbox Code Playgroud)

作为示例,我们从数据库检查用户是否是超级管理员。如果是的话,我们会为他们创建一个新的身份,并赋予他们必要的角色作为主张。

所有身份都在主体上组合以生成其声明集,因此所有其他声明也仍然可用。