.net core 在Blazor客户端应用程序中,登录后主页顶部显示Hello+;一个很长的哈希代码,而不是用户名
每次登录Blazor客户端应用程序后,我都会看到下面的图片,我必须刷新页面,以便用用户名或电子邮件替换哈希代码 loginDisplay.razor应该显示用户的姓名/电子邮件:.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
<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);