使用 Azure AD 身份验证的自定义授权
Custom authorization with Azure AD authentication
我正在使用 ASP.NET Core 2.0 开发服务结构无状态 Web 应用程序。此应用程序使用 Azure AD 对来自多个 AD 租户的用户进行身份验证。我想要实现的是使用我自己的基于角色的授权,可以使用授权用户在我的应用程序中进行配置。这些角色存储在我的应用程序中。
在我当前的实现中,我通过使用自定义 IAuthorizationRequirement
添加策略来向我的应用程序添加授权。在要求声明的授权期间,根据用户权限添加。这意味着声明已添加 post-登录。 [Authorize(Roles = "role")]
属性也不起作用,因为添加了角色声明 post-login
使用 Azure AD 中经过身份验证的用户实现此自定义授权的正确方法是什么?
您可以在用户通过 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);
}
}
};
});
这里以数据库查询用户是否为超级管理员为例。然后,如果他们是,我们为他们创建一个新身份,并将必要的角色作为声明。
所有身份都在主体上组合以生成其声明集,因此所有其他声明也仍然可用。
我正在使用 ASP.NET Core 2.0 开发服务结构无状态 Web 应用程序。此应用程序使用 Azure AD 对来自多个 AD 租户的用户进行身份验证。我想要实现的是使用我自己的基于角色的授权,可以使用授权用户在我的应用程序中进行配置。这些角色存储在我的应用程序中。
在我当前的实现中,我通过使用自定义 IAuthorizationRequirement
添加策略来向我的应用程序添加授权。在要求声明的授权期间,根据用户权限添加。这意味着声明已添加 post-登录。 [Authorize(Roles = "role")]
属性也不起作用,因为添加了角色声明 post-login
使用 Azure AD 中经过身份验证的用户实现此自定义授权的正确方法是什么?
您可以在用户通过 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);
}
}
};
});
这里以数据库查询用户是否为超级管理员为例。然后,如果他们是,我们为他们创建一个新身份,并将必要的角色作为声明。
所有身份都在主体上组合以生成其声明集,因此所有其他声明也仍然可用。