我有问题。我的前端和后端都使用 azure 广告。前端使用angular。 FE 将连接到 azure AD 并将令牌传递给我们的 api。我们的 api 将验证来自 FE 的令牌。然后我将检查来自 azure ad 的用户电子邮件。如果我们的数据库中不存在用户。我会在我的数据库中添加一个新的。所以现在我不想在 azure 广告中使用角色管理。我可以自己发行另一个令牌而不是使用 azure 广告吗?问题是,当我想在我的数据库中使用角色表授权我的 api 时。我不能简单地 [Authorize("Admin")] 因为这将检查 azure 令牌中的角色声明。我想在我的数据库中使用我的角色。所以我能想到的其他解决方案是创建自定义授权属性,但这可能不是最佳解决方案,因为它会在每个请求中搜索 db 中的用户角色。所以现在如果有人像我的问题一样有经验,请随时提出建议。谢谢
答案 0 :(得分:0)
勾选this thread,您可以在 OIDC 事件的 OnTokenValidated 中添加自定义声明:
services.AddAuthentication(AzureADDefaults.AuthenticationScheme)
.AddAzureAD(options => Configuration.Bind("AzureAd", options));
services.Configure<OpenIdConnectOptions>(AzureADDefaults.OpenIdScheme, options =>
{
options.Events = new OpenIdConnectEvents
{
OnTokenValidated = ctx =>
{
// add claims
var claims = new List<Claim>
{
new Claim(ClaimTypes.Role, "Admin")
};
var appIdentity = new ClaimsIdentity(claims);
ctx.Principal.AddIdentity(appIdentity);
return Task.CompletedTask;
},
};
});
然后,您可以创建 Claims-based authorization 或 Policy-based authorization,还可以创建 Custom Authorization attributes 来进行身份验证。