使用 Identity 在 Blazor 中检索用户名
Retrieving user name in Blazor using Identity
我有一个使用脚手架身份页面的 Blazor 应用程序。开箱即用,用户标识由 LoginDisplay.razor 组件显示。该组件调用
@context.User.Identity.Name
显示当前用户名(不是自然名)。
因此,为了显示自然名称,我使用本指南首先对默认身份模式进行更改:https://docs.microsoft.com/en-us/aspnet/core/security/authentication/add-user-data?view=aspnetcore-3.1&tabs=visual-studio#test-create-view-download-delete-custom-user-data 因为 Blazor 脚手架身份使用剃刀页面。
然而,在这样做之后,我意识到没有办法在 Blazor 的 Razor 组件中获取这些额外的用户信息。但是,我发现 Claims 可用于 Razor 组件。所以我想在用户注册时向他们添加声明。因此,我使用以下语句在 Register.cshtml.cs 中添加用户声明:
await _userManager.AddClaimAsync(user, new System.Security.Claims.Claim("name", user.Name));
user.Name 来自用户输入。
这样做之后,有趣的部分是现在当我 运行 应用程序时,@context.User.Identity.Name 是 return 自然名称,而不是用户 ID。
我的问题是为什么会这样?为什么添加 'name' 声明会使 @context.User.Identity.Name return 成为自然名称而不是之前的用户 ID?
我正在使用 .NET5 最新预览版。
一头雾水。
await _userManager.AddClaimAsync(user, new System.Security.Claims.Claim("name", user.Name));
除非您知道自己在做什么,否则这样做不是一个好主意。
Why does adding a 'name' claim make @context.User.Identity.Name return the natural name instead of the userid as it was doing previously?
`@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”且值为“NaturalName”的声明,Jwt 令牌将包含名为“name”且值为“NaturalName”的声明,而不是
UserName
列。这正是您的代码所做的:将用户添加到 UserClaims table 中的“名称”声明,因此 @context.User.Identity.Name
returns“NaturalName”值。
顺便说一句,还有一个名为preferred_username的声明,它仍然保留着UserName列的值;也就是说,电子邮件值...
However, after doing this, I realized that there is no way to get this extra user information in a Razor component in Blazor.
不正确...我知道有五种方法可以做到这一点,具体取决于您的要求以及您使用的 Blazor 风格。是 client-side 还是 server-side ?你没有提到这个...
Is it documented anywhere that entering a 'name' claim would force context.User.Identity.Name to provide the 'name' claim instead of the userid?
据我所知...尤其不是您描述的方式。事情要复杂得多。实际上,它记录在我的答案中。文档没有太大的价值。您应该测试该软件,了解它的工作原理等。
告诉你该怎么做... 运行 你的应用程序没有将你的用户添加到任何声明中。现在通过身份验证,并看到您的电子邮件已显示。按 F12,导航到“应用程序”选项卡。查找 Key/Value table 下方的 profile
部分,然后查找 name
项。它的价值应该是你的电子邮件。 name
是声明的名称。这是 name
声明。默认情况下,它由 IdentityServer 在 Jwt 令牌中传递,如果没有 name
声明分配给用户,则其值取自 UserName 列。另请注意,还有另一个名为 preferred_username 的声明,唉,它的值是用户的电子邮件。
现在在 AspNetUserClaims 中为用户分配一个名为 name
的声明:
在 ClaimType 列中添加字符串 name
并在 ClaimValue 中设置字符串 user3656651
...Save。现在再一次,运行 你的应用程序,验证... @context.User.Identity.Name
现在显示字符串 user3656651
,而不是用户的电子邮件,因为 IdentityServer 发现你的用户被分配到 name
声称,对她来说,有什么比显示自然名称更自然 ;) 。执行以上操作,您将学到比任何文档所能提供的更多的知识。
注意:在您的 WebAssembly 应用程序的 Program.Main 方法中有以下代码:
builder.Services.AddApiAuthorization();
您可以将其扩充为 ;
builder.Services.AddApiAuthorization(configure => configure.UserOptions.NameClaim = "preferred_username");
Gets or sets the claim type to use for the user name.
换句话说,@context.User.Identity.Name
被指示显示 preferred_username
声明所持有的值。
注意:该指令是 Blazor 的一部分...preferred_username
声明由 IdentityServer 根据 OpenID Connect 和 oauth2.o 规范创建。
我所知道的关于上述指令的唯一文档是:获取或
设置用于用户名的声明类型。在发现上述选项后我找到了它...
无论如何,这是什么意思?默认使用 name
声明...
我有一个使用脚手架身份页面的 Blazor 应用程序。开箱即用,用户标识由 LoginDisplay.razor 组件显示。该组件调用
@context.User.Identity.Name
显示当前用户名(不是自然名)。 因此,为了显示自然名称,我使用本指南首先对默认身份模式进行更改:https://docs.microsoft.com/en-us/aspnet/core/security/authentication/add-user-data?view=aspnetcore-3.1&tabs=visual-studio#test-create-view-download-delete-custom-user-data 因为 Blazor 脚手架身份使用剃刀页面。 然而,在这样做之后,我意识到没有办法在 Blazor 的 Razor 组件中获取这些额外的用户信息。但是,我发现 Claims 可用于 Razor 组件。所以我想在用户注册时向他们添加声明。因此,我使用以下语句在 Register.cshtml.cs 中添加用户声明:
await _userManager.AddClaimAsync(user, new System.Security.Claims.Claim("name", user.Name));
user.Name 来自用户输入。
这样做之后,有趣的部分是现在当我 运行 应用程序时,@context.User.Identity.Name 是 return 自然名称,而不是用户 ID。
我的问题是为什么会这样?为什么添加 'name' 声明会使 @context.User.Identity.Name return 成为自然名称而不是之前的用户 ID?
我正在使用 .NET5 最新预览版。
一头雾水。
await _userManager.AddClaimAsync(user, new System.Security.Claims.Claim("name", user.Name));
除非您知道自己在做什么,否则这样做不是一个好主意。
Why does adding a 'name' claim make @context.User.Identity.Name return the natural name instead of the userid as it was doing previously?
`@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”且值为“NaturalName”的声明,Jwt 令牌将包含名为“name”且值为“NaturalName”的声明,而不是
UserName
列。这正是您的代码所做的:将用户添加到 UserClaims table 中的“名称”声明,因此 @context.User.Identity.Name
returns“NaturalName”值。
顺便说一句,还有一个名为preferred_username的声明,它仍然保留着UserName列的值;也就是说,电子邮件值...
However, after doing this, I realized that there is no way to get this extra user information in a Razor component in Blazor.
不正确...我知道有五种方法可以做到这一点,具体取决于您的要求以及您使用的 Blazor 风格。是 client-side 还是 server-side ?你没有提到这个...
Is it documented anywhere that entering a 'name' claim would force context.User.Identity.Name to provide the 'name' claim instead of the userid?
据我所知...尤其不是您描述的方式。事情要复杂得多。实际上,它记录在我的答案中。文档没有太大的价值。您应该测试该软件,了解它的工作原理等。
告诉你该怎么做... 运行 你的应用程序没有将你的用户添加到任何声明中。现在通过身份验证,并看到您的电子邮件已显示。按 F12,导航到“应用程序”选项卡。查找 Key/Value table 下方的 profile
部分,然后查找 name
项。它的价值应该是你的电子邮件。 name
是声明的名称。这是 name
声明。默认情况下,它由 IdentityServer 在 Jwt 令牌中传递,如果没有 name
声明分配给用户,则其值取自 UserName 列。另请注意,还有另一个名为 preferred_username 的声明,唉,它的值是用户的电子邮件。
现在在 AspNetUserClaims 中为用户分配一个名为 name
的声明:
在 ClaimType 列中添加字符串 name
并在 ClaimValue 中设置字符串 user3656651
...Save。现在再一次,运行 你的应用程序,验证... @context.User.Identity.Name
现在显示字符串 user3656651
,而不是用户的电子邮件,因为 IdentityServer 发现你的用户被分配到 name
声称,对她来说,有什么比显示自然名称更自然 ;) 。执行以上操作,您将学到比任何文档所能提供的更多的知识。
注意:在您的 WebAssembly 应用程序的 Program.Main 方法中有以下代码:
builder.Services.AddApiAuthorization();
您可以将其扩充为 ;
builder.Services.AddApiAuthorization(configure => configure.UserOptions.NameClaim = "preferred_username");
Gets or sets the claim type to use for the user name.
换句话说,@context.User.Identity.Name
被指示显示 preferred_username
声明所持有的值。
注意:该指令是 Blazor 的一部分...preferred_username
声明由 IdentityServer 根据 OpenID Connect 和 oauth2.o 规范创建。
我所知道的关于上述指令的唯一文档是:获取或 设置用于用户名的声明类型。在发现上述选项后我找到了它...
无论如何,这是什么意思?默认使用 name
声明...