我想显示当前登录用户的电子邮件地址。但是我不知道如何得到它。我搜索了许多小时,却一无所获。我找到了一些片段来获取姓名,但没有找到任何片段来获取其他字段,例如电子邮件或电话号码。 此代码段中的用户没有ID,无法从数据库中获取该ID。
@page "/"
@inject AuthenticationStateProvider AuthenticationStateProvider
<button @onclick="@LogUsername">Write user info to console</button>
<br />
<br />
@Message
@code {
string Message = "";
private async Task LogUsername()
{
var authState = await AuthenticationStateProvider.GetAuthenticationStateAsync();
var user = authState.User;
if (user.Identity.IsAuthenticated)
{
Message = ($"{user.Identity.Name} is authenticated.");
}
else
{
Message = ("The user is NOT authenticated.");
}
}
}
答案 0 :(得分:5)
对于具有身份的Asp.Net Core Blazor,“声明”将不包含电子邮件声明。
要获取用户,您可以尝试使用UserManager.GetUserAsync(ClaimsPrincipal principal)
,如下所示:
@page "/"
@inject AuthenticationStateProvider AuthenticationStateProvider
@using Microsoft.AspNetCore.Identity;
@inject UserManager<IdentityUser> UserManager;
<button @onclick="@LogUsername">Write user info to console</button>
<br />
<br />
@Message
@code {
string Message = "";
private async Task LogUsername()
{
var authState = await AuthenticationStateProvider.GetAuthenticationStateAsync();
var user = authState.User;
if (user.Identity.IsAuthenticated)
{
var currentUser = await UserManager.GetUserAsync(user);
Message = ($"{user.Identity.Name} is authenticated. Email is { currentUser.Email }");
}
else
{
Message = ("The user is NOT authenticated.");
}
}
}
答案 1 :(得分:1)
在我看来,您没有通过身份验证机制将电子邮件地址作为声明的一部分传递。不确定您使用的是哪个提供程序(Identity Server等),请查看以下链接,尤其是有关声明和过程逻辑的部分可能是您问题的答案:here
同样,我认为问题出在索赔上。从理论上讲,一旦您收到了电子邮件,您就应该可以通过通用的代码委托人来访问它。
答案 2 :(得分:0)
我猜想,如果ClaimPrincipal对象(代码段中的用户)包含电子邮件声明,则可以这样检索它:
https://kingjames.herokuapp.com/api/bible/1/1/1
如果未将电子邮件添加为声明,则可以通过如下调用UserManager.GetEmailAsync方法来检索电子邮件:
https://kingjames.herokuapp.com/api/bible/${params.book}/${params.chapter}/${params.verse}
注意:您还可以将电子邮件声明添加到检索到的ClaimsPrincipal,并从应用程序中的任何位置访问它。
希望这对您有帮助...