jwt - Blazor WASM 避免默认声明映射
问题描述
在服务器上,如果您编写以下代码,则可以避免声明的默认映射
services
.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, o =>
{
o.Authority = openIdConnectOptions.Authority;
o.TokenValidationParameters.ValidIssuer = openIdConnectOptions.ValidIssuer;
o.TokenValidationParameters.ValidAudiences = openIdConnectOptions.ValidAudiences;
o.MapInboundClaims = false;
o.TokenValidationParameters.RoleClaimType = "roles";
});
这是 MapInboundClaims = false; 这使它工作。
我知道在 Blazor Wasm 中面临同样的问题。一些声明被重命名,一些被丢弃。我非常想自己控制索赔映射。
我有这个 CustomUserFactor 来修复角色映射。也尝试映射 unique_name 但它不起作用。
using System.Linq;
using System.Security.Claims;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Components.WebAssembly.Authentication;
using Microsoft.AspNetCore.Components.WebAssembly.Authentication.Internal;
namespace Zeus.Client.Services.Auth
{
public class CustomUserFactory : AccountClaimsPrincipalFactory<RemoteUserAccount>
{
public CustomUserFactory(IAccessTokenProviderAccessor accessor)
: base(accessor)
{
}
public override async ValueTask<ClaimsPrincipal> CreateUserAsync(
RemoteUserAccount account,
RemoteAuthenticationUserOptions options)
{
var initialUser = await base.CreateUserAsync(account, options);
if (initialUser.Identity == null || !initialUser.Identity.IsAuthenticated)
{
return initialUser;
}
var userIdentity = (ClaimsIdentity) initialUser.Identity;
var tokenResult = await TokenProvider.RequestAccessToken();
if (tokenResult.TryGetToken(out var token))
{
var claims = JwtParser.ParseClaimsFromJwt(token.Value).ToList();
var uniqueName = claims.FirstOrDefault(x => x.Type == "unique_name");
if(uniqueName != null)
{
userIdentity.AddClaim(uniqueName);
}
var roles = claims.Where(x => x.Type == "role").ToList();
foreach (var claim in roles)
{
userIdentity.AddClaim(claim);
}
}
return initialUser;
}
}
}
解决方案
推荐阅读
- java - Java - 文件服务器内存泄漏
- php - 使用作曲家安装 Wordpress
- c - 将 2 个数组合并到 C 中的空的第 3 个数组中
- ruby-on-rails - 如何在 if 和 else 语句中引用特定的控制器
- php - Silex 匹配 GET 但没有 POST
- git - git clone 后 Unity 项目损坏
- python - 如何在需要对每列进行单独查询的表上设置索引?
- java - 在 Spring JMS 模块中获取 BeanNotOfRequiredTypeException
- c# - NHIbernate:获取由父对象的属性过滤的子对象
- .net - 如何在新/旧 RabbitMQ 队列声明/销毁时得到通知