gpt4 book ai didi

.net - 使用 .NET JWT 中间件验证自定义 token 以及 Azure token

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

目前,我正在使用标准 .NET 身份验证和 JWT 中间件来对用户进行身份验证。 Azure AD 是 token 颁发者。所以我的 Startup.cs 看起来像这样:

            var authentication = new AuthenticationOptions();
configuration.Bind("AzureAd", authentication);

services
.AddAuthentication(options =>
{
options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(options =>
{
options.Authority = $"{authentication.Instance}{authentication.TenantId}";
options.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters
{
ValidAudience = $"{authentication.ClientId}",
ValidIssuer = $"{authentication.Instance}{authentication.TenantId}/v2.0"
};
});

我使用[Authorize]标签来保护端点。我现在想要做的是为已登录的用户创建一个自定义 JWT。为此,我当前有以下代码:

            var username = User.Claims.FirstOrDefault(x => x.Type == "name").Value;
var email = User.Claims.FirstOrDefault(x => x.Type == "preferred_username").Value;

var authentication = new AuthenticationOptions
{
My client and tenant credentials
};

var mySecret = "someSecret";
var mySecurityKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(mySecret));

var tokenHandler = new JwtSecurityTokenHandler();
var tokenDescriptor = new SecurityTokenDescriptor
{
Subject = new ClaimsIdentity(new Claim[]
{
new Claim("name", username),
new Claim("preferred_username", email)
}),
Issuer = $"{authentication.Instance}{authentication.TenantId}/v2.0",
Audience = $"{authentication.ClientId}",
SigningCredentials = new SigningCredentials(mySecurityKey, SecurityAlgorithms.HmacSha256Signature),
};

var tokenPlainText = tokenHandler.CreateToken(tokenDescriptor);
var token = tokenHandler.WriteToken(tokenPlainText);

return token;

我想要做的是使用 [Authorize] 标记来验证用户登录时 Azure AD 颁发的 token 以及我的代码创建的自定义 JWT。问题是(我假设)Azure 使用我无权访问的私钥对 token 进行签名。

例如,是否可以在 .AddJwtBearer 中包含多个验证选项,以便它检查用户有效的两种可能方式,并在其中任何一种通过时授予访问权限?或者有没有办法创建一个自定义 token 来通过已有的检查?或者也许是一种向端点添加另一个标签的方法,使其变得类似于 [Authorize] || [CustomAuthorize] 如果其中之一通过,用户将获得访问权限?

最佳答案

不使用自定义 JWT token

我真的不认为您需要创建自己的 token 。 AAD 在管理用户及其登录状态方面做得非常好。作为一种可能的替代方案,您还可以评估 cookie authentication对于这些登录用户。创建您自己的 JWT token 听起来设计过度,而且可能不太安全。

验证来自不同来源的 token

您可以链接 .AddJwtBearer 调用来设置多个 token 源。您需要为第二个方案指定一个不同的方案名称。执行此操作时,您还需要在 UseAuthentication 之后执行一些特殊处理来检查该方案。这可能是最干净的解决方案,也最接近您所描述的内容。

services.AddAuthentication(options =>
{
options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(jwtOptions =>
{
//...
}).AddJwtBearer(_FallbackScheme, jwtOptions =>
{
//...
});


// ...

app.UseAuthentication();
// https://github.com/aspnet/Security/issues/1847
app.Use(async (context, next) => {
if (!context.User.Identity.IsAuthenticated)
{
var result = await context.AuthenticateAsync(_FallbackScheme);
if (result.Succeeded)
{
context.User = result.Principal;
}
}
await next();
});

扩展声明

如果您只想在运行时添加一些额外的声明,那么在运行时执行此操作也可以。但是,每次 API 调用都会发生这种情况,因此您需要牢记这一点。

https://joonasw.net/view/adding-custom-claims-aspnet-core-2

关于.net - 使用 .NET JWT 中间件验证自定义 token 以及 Azure token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60931101/

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