.net core 在Blazor客户端应用程序中,登录后主页顶部显示Hello+;一个很长的哈希代码,而不是用户名

.net core 在Blazor客户端应用程序中,登录后主页顶部显示Hello+;一个很长的哈希代码,而不是用户名,.net-core,blazor,.net Core,Blazor,每次登录Blazor客户端应用程序后,我都会看到下面的图片,我必须刷新页面,以便用用户名或电子邮件替换哈希代码 loginDisplay.razor应该显示用户的姓名/电子邮件: <AuthorizeView> <Authorized> Hello, @context.User.Identity.Name! <a href="LogOut">Log out</a> </Authorized&g

每次登录Blazor客户端应用程序后,我都会看到下面的图片,我必须刷新页面,以便用用户名或电子邮件替换哈希代码

loginDisplay.razor应该显示用户的姓名/电子邮件:

<AuthorizeView>
    <Authorized>
        Hello, @context.User.Identity.Name!
        <a href="LogOut">Log out</a>
    </Authorized>
    <NotAuthorized>
        <a href="Register">Register</a>
        <a href="Login">Log in</a>
</NotAuthorized>

我使用了Chris Sainty从中找到的自定义状态提供程序

  • GetAuthentication在localStorage中搜索是否存在已保存的令牌,并返回基于该令牌的新状态,否则将创建新令牌

  • MarkAsAuthenticated让状态提供程序知道用户使用提供的电子邮件登录

  • MarkasLogeOut与上面的相反

  • ParseClaimsFromJwt正在从令牌读取声明

:

公共类APAuthenticationStateProvider:AuthenticationStateProvider
{
私有只读HttpClientu HttpClient;
专用只读ILocalStorageService\u localStorage;
公共ApiAuthenticationStateProvider(HttpClient HttpClient、ILocalStorageService localStorage)
{
_httpClient=httpClient;
_localStorage=localStorage;
}
公共重写异步任务GetAuthenticationStateAync()
{
var savedToken=await_localStorage.GetItemAsync(“authToken”);
if(string.IsNullOrWhiteSpace(savedToken))
{
返回新的AuthenticationState(newclaimsprincipal(newclaimsidentity());
}
_httpClient.DefaultRequestHeaders.Authorization=新的AuthenticationHeaderValue(“承载人”,savedToken);
返回新的身份验证状态(newclaimsprincipal(newclaimsidentity(ParseClaimsFromJwt(savedToken),“jwt”));
}
公共无效MarkUserAsAuthenticated(字符串电子邮件)
{
var authenticatedUser=newclaimsprincipal(newclaimsidentity(new[]{newclaim(ClaimTypes.Name,email)},“apiauth”);
var authState=Task.FromResult(新的AuthenticationState(authenticatedUser));
NotifyAuthenticationStateChanged(authState);
}
public void MarkUserAsLoggedOut()
{
var anonymousUser=newclaimsprincipal(newclaimsidentity());
var authState=Task.FromResult(新身份验证状态(匿名用户));
NotifyAuthenticationStateChanged(authState);
}
私有IEnumerable ParseClaimsFromJwt(字符串jwt)
{
var索赔=新列表();
var有效载荷=jwt.Split('.')[1];
var jsonBytes=parsebase64,不添加输出(有效负载);
var keyValuePairs=JsonSerializer.Deserialize(jsonBytes);
keyValuePairs.TryGetValue(ClaimTypes.Role、out对象角色);
if(角色!=null)
{
if(roles.ToString().Trim().StartsWith(“[”))
{
var parsedRoles=JsonSerializer.Deserialize(roles.ToString());
foreach(parsedRoles中的var parsedRole)
{
添加(新索赔(ClaimTypes.Role,parsedRole));
}
}
其他的
{
添加(新声明(ClaimTypes.Role,roles.ToString());
}
keyValuePairs.Remove(ClaimTypes.Role);
}
claims.AddRange(keyValuePairs.Select(kvp=>newclaims(kvp.Key,kvp.Value.ToString());
退货索赔;
}
专用字节[]ParseBase64不带输出添加(字符串base64)
{
交换机(base64.Length%4)
{
案例2:base64+=“=”中断;
案例3:base64+=“=”中断;
}
返回Convert.FromBase64String(base64);
}
}

那篇文章的代码中有一个小问题,只需传递电子邮件而不是令牌。请注意
void MarkUserAsAuthenticated(string Email)
中参数的名称

在AuthService.cs中

((ApiA uthenticationStateProvider)_authenticationStateProvider)
   //.MarkUserAsAuthenticated(loginResult.Token);
     .MarkUserAsAuthenticated(loginModel.Email);

添加调试日志。这取决于你的IDP respondsHi@Sorush,我已经更新了代码示例和博客文章。我对错误表示歉意。升级到Blazor的新版本时出现了一些问题。我能问一下你是否能在文章中发现问题,如果你能留下评论,我就可以修复它吗?我主要是运气好,听说了别这样。干杯,克里斯·汉克斯@克里斯我会的。
((ApiA uthenticationStateProvider)_authenticationStateProvider)
   //.MarkUserAsAuthenticated(loginResult.Token);
     .MarkUserAsAuthenticated(loginModel.Email);