Blazor WebApi 身份信息
Blazor WebApi Identity Information
我无法从 API 中获取用户身份信息。
我的项目由一个独立的 WASM 应用程序、IDP 和 WebApi.
组成
我已经设置好一切并且可以正常工作,但我需要的是来自 Blazor 客户端的调用以从 api 获取一些数据。 Api 然后使用用户的电子邮件地址来识别他们并获取他们的数据。
我看过类似的问题,但解决方案对我的项目不起作用。
[HttpGet("GetData")]
public async Task<IActionResult> GetData()
{
string test = User.Identity.Name; // returns null
string username = "myuser@users.com";
List<string> data= new List<string>();
data= (await _dataRepository.GetData(username)).ToList();
if (data.Count > 0)
{
return Ok(data);
}
else
{
return NoContent();
}
}
所以我设置用户名的地方有没有办法获取通过请求的用户的电子邮件?
已编辑
访问令牌:
{
"alg": "RS256",
"kid": "2D49329C75FC43C78590AF6F6A0EFDB2",
"typ": "at+jwt"
}
{
"nbf": 1639243158,
"exp": 1639246758,
"iss": "https://localhost:5000",
"aud": "https://localhost:5000/resources",
"client_id": "ATS",
"sub": "4892725f-f6da-4a28-827a-ce666bb6f098",
"auth_time": 1638729064,
"idp": "local",
"jti": "53CB2F8FCB2EB34E3501E2C210B59B5D",
"sid": "8463E4AA74D7369C1176249ED8FA46B1",
"iat": 1639243158,
"scope": [
"openid",
"profile",
"MY_API"
"email"
],
"amr": [
"pwd"
]
}
首先,您通常会使用 [Authorize(...)] 属性保护您的控制器操作方法,并在 ASP.NET Core 中查找授权以获取更多详细信息。
其次,未找到 name/email 时最常见的问题是您需要使用
关闭声明映射
JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
JwtSecurityTokenHandler.DefaultOutboundClaimTypeMap.Clear();
这是因为默认情况下,Microsoft 和 OpenID 对于声明名称应该是什么有不同的看法,因此明智的做法是首先清除此映射,然后再告诉 Microsoft name/role 通过设置声明:
opt.TokenValidationParameters.RoleClaimType = "roles";
opt.TokenValidationParameters.NameClaimType = "name";
有关声明映射的更多详细信息,请访问:
https://docs.microsoft.com/en-us/aspnet/core/security/authentication/claims?view=aspnetcore-6.0
我无法从 API 中获取用户身份信息。 我的项目由一个独立的 WASM 应用程序、IDP 和 WebApi.
组成我已经设置好一切并且可以正常工作,但我需要的是来自 Blazor 客户端的调用以从 api 获取一些数据。 Api 然后使用用户的电子邮件地址来识别他们并获取他们的数据。
我看过类似的问题,但解决方案对我的项目不起作用。
[HttpGet("GetData")]
public async Task<IActionResult> GetData()
{
string test = User.Identity.Name; // returns null
string username = "myuser@users.com";
List<string> data= new List<string>();
data= (await _dataRepository.GetData(username)).ToList();
if (data.Count > 0)
{
return Ok(data);
}
else
{
return NoContent();
}
}
所以我设置用户名的地方有没有办法获取通过请求的用户的电子邮件?
已编辑 访问令牌:
{
"alg": "RS256",
"kid": "2D49329C75FC43C78590AF6F6A0EFDB2",
"typ": "at+jwt"
}
{
"nbf": 1639243158,
"exp": 1639246758,
"iss": "https://localhost:5000",
"aud": "https://localhost:5000/resources",
"client_id": "ATS",
"sub": "4892725f-f6da-4a28-827a-ce666bb6f098",
"auth_time": 1638729064,
"idp": "local",
"jti": "53CB2F8FCB2EB34E3501E2C210B59B5D",
"sid": "8463E4AA74D7369C1176249ED8FA46B1",
"iat": 1639243158,
"scope": [
"openid",
"profile",
"MY_API"
"email"
],
"amr": [
"pwd"
]
}
首先,您通常会使用 [Authorize(...)] 属性保护您的控制器操作方法,并在 ASP.NET Core 中查找授权以获取更多详细信息。
其次,未找到 name/email 时最常见的问题是您需要使用
关闭声明映射JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
JwtSecurityTokenHandler.DefaultOutboundClaimTypeMap.Clear();
这是因为默认情况下,Microsoft 和 OpenID 对于声明名称应该是什么有不同的看法,因此明智的做法是首先清除此映射,然后再告诉 Microsoft name/role 通过设置声明:
opt.TokenValidationParameters.RoleClaimType = "roles";
opt.TokenValidationParameters.NameClaimType = "name";
有关声明映射的更多详细信息,请访问:
https://docs.microsoft.com/en-us/aspnet/core/security/authentication/claims?view=aspnetcore-6.0