正在使用Identity检索Blazor中的用户名



我有一个Blazor应用程序,它使用脚手架式的Identity页面。开箱即用,用户ID由LogiDiskplay.razor组件显示。该组件称为

@context.User.Identity.Name

以显示当前的userid(而不是自然名称)。因此,为了显示自然名称,我使用本指南首先对默认的Identity模式进行了更改:https://learn.microsoft.com/en-us/aspnet/core/security/authentication/add-user-data?view=aspnetcore-3.1&tabs=visualstudio#测试创建视图下载删除自定义用户数据,因为Blazor scaffolded身份使用剃刀页面。然而,在这样做之后,我意识到没有办法在Blazor中的Razor组件中获得这些额外的用户信息。然而,我发现Razor组件可以使用索赔。因此,我考虑在用户注册时向他们添加声明。因此,我使用以下语句在Register.cshtml.cs:中添加了一个用户声明

await _userManager.AddClaimAsync(user, new System.Security.Claims.Claim("name", user.Name));

用户。名称来自用户输入。

完成此操作后,有趣的部分是,现在当我运行应用程序@context时。使用者身份Name返回的是自然名称,而不是用户ID。

我的问题是为什么会这样?为什么添加"name"声明会产生@context。使用者身份Name返回自然名称,而不是像以前那样返回userid?

我正在使用。NET5最新预览。

完全困惑。

await _userManager.AddClaimAsync(user, new System.Security.Claims.Claim("name", user.Name));

这样做不是一个好主意,除非你知道自己在做什么。

为什么添加"name"声明会产生@context。使用者身份Name返回自然名称,而不是像以前那样返回userid?

`@context.User.Identity.Name` ordinarily returns the value of `UserName` column in the Users table, which by default is the user's email. This value is passed to the client in the Jwt token as a claim called "name". If you add a user 

对名为";name";其值为"0";NaturalName";,Jwt令牌将包含称为";name";其值为"0";NaturalName";而不是UserName列。这正是您的代码正在做的事情:将用户添加到";name";因此@context.User.Identity.Name返回UserClaims表中的"claim";NaturalName";价值

顺便说一句,还有另一个名为preferred_username的声明,它仍然保留username列的值;即电子邮件值。。。

然而,在这样做之后,我意识到没有办法在Blazor中的Razor组件中获得这些额外的用户信息。

不正确。。。我知道大约五种方法,这取决于你的要求和你使用的Blazor的味道。是客户端还是服务器端?你没有提到这个。。。

是否有任何地方记录了输入"名称"声明会强制上下文。使用者身份要提供"Name"声明而不是userid的Name?

我不知道。。。尤其不是用你描述的方式。事情要复杂得多。事实上,我的回答中有记载。文件没有太大的价值。你应该测试软件,学习它的工作原理等。

告诉你该怎么做…在不将用户添加到任何索赔中的情况下运行你的应用程序。现在已通过身份验证,并查看是否显示您的电子邮件。按F12,导航到"应用程序"选项卡。在键/值表下方查找profile部分,然后查找项目name。它的价值应该是你的电子邮件。name是索赔的名称。这是name的声明。默认情况下,它由IdentityServer在Jwt令牌中传递,如果没有为用户分配name声明,则其值取自UserName列。还需要注意的是,还有一个名为preferred_username的声明,其值是用户的电子邮件。

现在在AspNetUserClaims中为用户分配一个名为name的声明:在ClaimType列中添加字符串name,在ClaimValue中设置字符串user3656651。。。拯救现在,再次运行您的应用程序,进行身份验证。。。@context.User.Identity.Name现在显示字符串user3656651,而不是用户的电子邮件,因为IdentityServer发现您的用户被分配到name声明,对她来说,什么比显示自然名称更自然;)。做到以上几点,你会学到比任何文档都要多得多的东西。

注:在程序中。你的WebAssembly应用程序的主要方法有这样的代码:

builder.Services.AddApiAuthorization();

您可以将其扩充为;

builder.Services.AddApiAuthorization(configure => configure.UserOptions.NameClaim = "preferred_username");

获取或设置要用于用户名的声明类型。

换句话说,@context.User.Identity.Name被指示显示preferred_username声明保持的值。

注:本说明书是Blazor。。。CCD_ 16声明由OpenID Connect和oauth2.o规范指定的IdentityServer创建。

我所知道的关于上述指令的唯一文档是:获取或设置要用于用户名的声明类型。在发现上述选项后,我找到了它。。。

不管怎样,这是什么意思?默认情况下使用name声明。。。

相关内容

  • 没有找到相关文章

最新更新