获取当前用户 Blazor webassembly 的 UserId
Getting UserId of current user Blazor webassembly
所以我正在编写一个 Blazor webassembly 应用程序,具有 asp.ner 核心标识。我需要获取当前用户的 ID,而不是 IDenty 中的方法给出的用户名。
方法
上下文。 User.identity.name
提供了用户名,但我需要 model/table 中的 fk 的 ID。
我不能使用用户名,因为用户名可能会改变。
我在网上搜索过,但我一直只看到返回的用户名。
如有任何帮助,我们将不胜感激。
我将其与样板身份服务器一起使用:
@page "/claims"
@inject AuthenticationStateProvider AuthenticationStateProvider
<h3>ClaimsPrincipal Data</h3>
<p>@_authMessage</p>
@if (_claims.Count() > 0)
{
<table class="table">
@foreach (var claim in _claims)
{
<tr>
<td>@claim.Type</td>
<td>@claim.Value</td>
</tr>
}
</table>
}
<p>@_userId</p>
@code {
private string _authMessage;
private string _userId;
private IEnumerable<Claim> _claims = Enumerable.Empty<Claim>();
protected override async Task OnParametersSetAsync()
{
await GetClaimsPrincipalData();
await base.OnParametersSetAsync();
}
private async Task GetClaimsPrincipalData()
{
var authState = await AuthenticationStateProvider.GetAuthenticationStateAsync();
var user = authState.User;
if (user.Identity.IsAuthenticated)
{
_authMessage = $"{user.Identity.Name} is authenticated.";
_claims = user.Claims;
_userId = $"User Id: {user.FindFirst(c => c.Type == "sub")?.Value}";
}
else
{
_authMessage = "The user is NOT authenticated.";
}
}
}
在Startup.cs中,在ConfigureServices
中添加以下行
services.AddHttpContextAccessor();
在您的 Blazor 组件中,在文件顶部添加以下行
@using System.Security.Claims
@inject IHttpContextAccessor HttpContextAccessor
在您的方法中,添加以下行以获取 UserId
var principal = HttpContextAccessor.HttpContext.User;
var loggedInUserId = principal.FindFirstValue(ClaimTypes.NameIdentifier);
不是答案,只是关于使用断点找到答案的提示。我的站点是 Blazor Server,因此情况很可能有所不同——就我而言,Brian Parker 的解决方案对我不起作用,因此我执行了以下操作:
var user = (await AuthenticationStateProvider.GetAuthenticationStateAsync()).User;
if (true) {} // or any other code here, breakpoint this line
如果您在获取用户后立即设置断点,运行 应用程序在断点时将鼠标悬停在代码中的用户变量上,它将弹出完整的对象。通过将鼠标悬停在各个字段上,您可以进行调查。我发现声明类型字符串很长,例如“http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier”
所以对我有用的答案是:
var user = (await AuthenticationStateProvider.GetAuthenticationStateAsync()).User;
string userId = user.FindFirst(c => c.Type.Contains("nameidentifier"))?.Value;
我的观点是,当文档很复杂,或者当技术变化很快以至于今天的正确答案是第二天的错误线索时,你可以通过使用 VS 来挖掘很多东西。
希望对某人有所帮助。 :D
所以我正在编写一个 Blazor webassembly 应用程序,具有 asp.ner 核心标识。我需要获取当前用户的 ID,而不是 IDenty 中的方法给出的用户名。
方法
上下文。 User.identity.name
提供了用户名,但我需要 model/table 中的 fk 的 ID。
我不能使用用户名,因为用户名可能会改变。
我在网上搜索过,但我一直只看到返回的用户名。
如有任何帮助,我们将不胜感激。
我将其与样板身份服务器一起使用:
@page "/claims"
@inject AuthenticationStateProvider AuthenticationStateProvider
<h3>ClaimsPrincipal Data</h3>
<p>@_authMessage</p>
@if (_claims.Count() > 0)
{
<table class="table">
@foreach (var claim in _claims)
{
<tr>
<td>@claim.Type</td>
<td>@claim.Value</td>
</tr>
}
</table>
}
<p>@_userId</p>
@code {
private string _authMessage;
private string _userId;
private IEnumerable<Claim> _claims = Enumerable.Empty<Claim>();
protected override async Task OnParametersSetAsync()
{
await GetClaimsPrincipalData();
await base.OnParametersSetAsync();
}
private async Task GetClaimsPrincipalData()
{
var authState = await AuthenticationStateProvider.GetAuthenticationStateAsync();
var user = authState.User;
if (user.Identity.IsAuthenticated)
{
_authMessage = $"{user.Identity.Name} is authenticated.";
_claims = user.Claims;
_userId = $"User Id: {user.FindFirst(c => c.Type == "sub")?.Value}";
}
else
{
_authMessage = "The user is NOT authenticated.";
}
}
}
在Startup.cs中,在ConfigureServices
中添加以下行services.AddHttpContextAccessor();
在您的 Blazor 组件中,在文件顶部添加以下行
@using System.Security.Claims
@inject IHttpContextAccessor HttpContextAccessor
在您的方法中,添加以下行以获取 UserId
var principal = HttpContextAccessor.HttpContext.User;
var loggedInUserId = principal.FindFirstValue(ClaimTypes.NameIdentifier);
不是答案,只是关于使用断点找到答案的提示。我的站点是 Blazor Server,因此情况很可能有所不同——就我而言,Brian Parker 的解决方案对我不起作用,因此我执行了以下操作:
var user = (await AuthenticationStateProvider.GetAuthenticationStateAsync()).User;
if (true) {} // or any other code here, breakpoint this line
如果您在获取用户后立即设置断点,运行 应用程序在断点时将鼠标悬停在代码中的用户变量上,它将弹出完整的对象。通过将鼠标悬停在各个字段上,您可以进行调查。我发现声明类型字符串很长,例如“http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier”
所以对我有用的答案是:
var user = (await AuthenticationStateProvider.GetAuthenticationStateAsync()).User;
string userId = user.FindFirst(c => c.Type.Contains("nameidentifier"))?.Value;
我的观点是,当文档很复杂,或者当技术变化很快以至于今天的正确答案是第二天的错误线索时,你可以通过使用 VS 来挖掘很多东西。
希望对某人有所帮助。 :D