blazor客户端.net core如何从oidc获取服务器api中的用户名?

问题描述 投票:0回答:1

你好,我有一些 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

enter image description here为什么名称为空?

在声明中 - NameIdentifier 接近我的登录名,但在登录之前也有一些 GUID / 我的登录名是

Emi
,如下面的屏幕截图所示,但我不希望在我的名字之前使用此 guid enter image description here

我应该删除这个指南并采取

:
之后的内容吗?有更好的办法吗? 我应该如何正确地获得此登录?在API /来自令牌?

感谢和问候

c# .net blazor authorization blazor-webassembly
1个回答
0
投票

您的方向是正确的,但您也可以按特定字符串进行搜索。如果您已将 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;
}
© www.soinside.com 2019 - 2024. All rights reserved.