你好,我有一些 blazor 项目 在客户端:
builder.Services.AddOidcAuthentication(opt =>
{
opt.ProviderOptions.Authority = "https://x.y.z/oidc";
opt.ProviderOptions.ClientId = "client";
opt.ProviderOptions.DefaultScopes.Add("email");
opt.ProviderOptions.DefaultScopes.Remove("profile");
opt.ProviderOptions.ResponseType = "code";
});
var IHttpServiceClient = builder.Services.AddHttpClient<IBaseHttpService,BaseHttpService>();
builder.Services.AddScoped<CustomAuthorizationMessageHandler>();
IHttpServiceClient.AddHttpMessageHandler<CustomAuthorizationMessageHandler>();
and handler is simple:
public class CustomAuthorizationMessageHandler:AuthorizationMessageHandler
{
public CustomAuthorizationMessageHandler(IAccessTokenProvider provider , NavigationManager nav) :base(provider, nav)
{
ConfigureHandler(authorizedUrls: new[] { nav.BaseUri });
}
}
这样它就可以在登录后授权/重定向回来等,在客户端我可以
username = (await _authenticationStateProvider.GetAuthenticationStateAsync()).User.Identity!.Name!;`
我有用户名/客户端就可以了。
现在是服务器端/api
builder.Services
.AddAuthentication("Bearer")
.AddJwtBearer("Bearer", options =>
{
options.Authority = `https://x.y.z/oidc`;
options.TokenValidationParameters.ValidateAudience = false;
options.TokenValidationParameters.ValidateIssuer = true;
});
现在在某些 api 端点上我需要来自这个裸令牌的相同的 USERNAME 如何获得?
string username = User.Identity.Name; // is empty / screenshot bellow
string username = User.Claims.Where(p => p.Type == ClaimTypes.NameIdentifier).First().Value; // is close / please check screenshot bellow
在声明中 - NameIdentifier 接近我的登录名,但在登录之前也有一些 GUID / 我的登录名是
Emi
,如下面的屏幕截图所示,但我不希望在我的名字之前使用此 guid
我应该删除这个指南并采取
:
之后的内容吗?有更好的办法吗?
我应该如何正确地获得此登录?在API /来自令牌?
感谢和问候
您的方向是正确的,但您也可以按特定字符串进行搜索。如果您已将 oidc 配置为还提供用户名声明,您可以执行以下操作。构建一个能够搜索所有声明的方法。例如:
private AuthenticatedUserModel GetUserClaimsFromAuthenticationAsync(AuthenticationState authState)
{
var claims = authState.User.Claims;
var objectId = claims.First(x => x.Type.Contains("objectidentifier")).Value;
var displayName = claims.First(x => x.Type.Equals("name")).Value;
var emailAddress = claims.FirstOrDefault(x => x.Type.Contains("emailaddress"))?.Value ?? null;
}