gpt4 book ai didi

azure - 是否有适当的 Core 3.0 API 中间件来将 Azure AD B2C 用户连接到我的数据库帐户?

转载 作者:行者123 更新时间:2023-12-02 00:50:02 24 4
gpt4 key购买 nike

我有一个 .Net Core 3 API,可以正确授权和验证通过 Azure AD B2C 传递给它的 token 。它还构建了一些自定义代码来检查 JWT token 中传递的范围,以确认对端点的访问。 (我正在使用 Microsoft.AspNetCore.Authentication.AzureADB2C.UI 包)下面是使这成为可能的中间件 block :

services.AddAuthentication(AzureADB2CDefaults.BearerAuthenticationScheme)
.AddAzureADB2CBearer(options => Configuration.Bind("AzureAdB2C", options));

var issuer = $"https://{Configuration["AzureAdB2C_Custom:TenantB2CHost"]}/{Configuration["AzureAdB2C:Domain"]}/v2.0/";
services.AddAuthorization(options =>
{
options.AddPolicy("api_read", policy => policy.Requirements.Add(new HasScopeRequirement("api_read", issuer)));
options.AddPolicy("api_write", policy => policy.Requirements.Add(new HasScopeRequirement("api_write", issuer)));
});

这一切似乎都有助于正确访问端点。然后,这些端点会在模型中公开来 self 的 SQL 数据库的各种信息。

但是,现在我正在尝试根据 JWT token 在我的数据库中实际与谁绑定(bind)来控制对这些端点中检索到的数据的特定部分的访问,从而了解安全性的另一个方面。

在我的特定情况下,我有一个帐户表,我可以在其中存储在 JWT token 中找到的 Azure AD B2C 的 ObjectID,然后在调用时使用该 ObjectID 获取帐户。我可以在端点顶部执行此操作,但我怀疑这不是最好的方法。看来我应该在启动的中间件层构建它作为某种处理程序。

有人可以帮我确认这将是正确的方法,并可能给我一个例子,或者至少为我指出正确的方向吗?

最佳答案

谢谢大家的回复。这是我为其他处理此问题的人提供的信息。感谢@juunas 发送的链接,这让我走上了正确的道路。该特定解决方案还不够,因为我正在使用 Azure AD B2C 库进行授权/身份验证。

这是我在尝试实现 @juunas 的解决方案后找到的链接: https://blog.denious.net/azure-b2c-role-based-authorization-part-1/

根据我在该链接中发现的内容,我的解决方案最终如下所示:

//Azure ADB2C is injected for authentication
services.AddAuthentication(AzureADB2CDefaults.BearerAuthenticationScheme)
.AddAzureADB2CBearer(options => Configuration.Bind("AzureAdB2C", options));

services.PostConfigure<JwtBearerOptions>(
AzureADB2CDefaults.JwtBearerAuthenticationScheme,
o =>
{
o.Events = new JwtBearerEvents
{
OnTokenValidated = ctx =>
{
//Get user's immutable object id from claims that came from Azure AD
string oid = ctx.Principal
.FindFirstValue("http://schemas.microsoft.com/identity/claims/objectidentifier");

//Get My Data EF context
var db = ctx.HttpContext.RequestServices.GetRequiredService<MyDataContext>();

//Grab the user - found in My Accounts table, tied to OID
var user = db.Accounts.Include("AccountType")
.Where(a => a.AuthorityId == oid)
.FirstOrDefault();

if (user != null)
{
// since we're using AADB2C only, the first identity is the only identity
var identity = ctx.Principal.Identities.First();

//Place My user type into the claims as a role claim type
var extraRoleClaim = new Claim(identity.RoleClaimType, user.AccountType);
identity.AddClaim(extraRoleClaim);
}

return Task.CompletedTask;
}
};
});

设置完成后,我就可以在端点内执行此操作:

if (User.IsInRole("Some Role"))
{
return Ok();
}
else
{
return StatusCode(403, "Forbidden - Unacceptable Role");
}

从链接中请注意,我还可以在 Controller 或操作的授权属性中执行以下操作:[Authorize(Roles = "Some Role")]

关于azure - 是否有适当的 Core 3.0 API 中间件来将 Azure AD B2C 用户连接到我的数据库帐户?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58401776/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com