在服务器端控制器的 Blazor WASM 中访问记录的用户信息
Access logged user information in Blazor WASM in server side controller
将 Visual Studio 2019 年提供的 Blazor 模板与身份 4 和个人帐户一起使用。
我在服务器端有这个控制器
[ApiController, Route("api/[controller]")]
public class DataController : Controller
{
[HttpGet, Route("GetUser")]
public async Task<ActionResult<bool>> GetUser()
{
return User?.Identity?.IsAuthenticated;
}
}
在客户端我有一个包含此代码的页面
@page "/User"
@inject HttpClient Http
@userIsLogged
@code {
private bool userIsLogged;
protected override async Task OnInitializedAsync()
{
userIsLogged = await Http.GetFromJsonAsync<bool>("api/data/GetUser");
}
}
如果用户已登录并且我从浏览器进入该页面,我可以看到表明用户已登录的 True 文本。
但是,如果我尝试通过输入 https://localhost:44395/Api/Data/GetUser 直接在浏览器中请求控制器结果,而不使用 HttpClient,即使用户已经登录。
从其他帖子,我猜问题与这一行有关
services.AddAuthentication().AddIdentityServerJwt()
但是我没有找到解决方法。
我的目标是能够使用 HttpClient 从客户端访问已登录用户的身份信息、用户名、角色等,以及直接从浏览器调用 ActionResult。
为了做到这一点,你能指出项目中缺少什么吗?
谢谢
伊格纳西奥
IdentityServer 使用 JWT(Json Web 令牌)来保护其资源(在本例中为 API),同时将应用程序注册为允许访问 Web Api(包含在它的范围内)
所以它在应用程序连接期间工作的原因是 httpclient 发送令牌,如下图所示
IdentityServer颁发的Token
另请注意,当您启动应用程序时,Blazor 应用程序将从身份服务器 (OidcConfigurationController) 请求所需的参数
如下图所示
另请参阅返回到 blazor 应用程序的参数,这些参数清楚地显示了范围
所以结论是,是的,您将无法访问您的安全 api,除非它在可以访问它的应用程序中
更新(问题更新后)
您需要在页面中注入以下提供程序
@inject Microsoft.AspNetCore.Components.Authorization.AuthenticationStateProvider AuthenticationStateProvider
然后如下使用
var authState = await AuthenticationStateProvider.GetAuthenticationStateAsync();
user = authState.User;
var claims = user.Claims?.ToList();
此外,如果您想根据 Roles/policy 保护您的网页
您可以在 program.cs
中添加政策
如下
builder.Services.AddAuthorizationCore(options =>
{
options.AddPolicy("Admin", policy =>
{
policy.RequireAuthenticatedUser();
policy.RequireRole("Admin");
});
});
然后在您的部分 class 中使用它,如下所示
[Authorize(Policy = "Admin")]
或在您的页面内如下
@using Microsoft.AspNetCore.Authorization
@attribute [Authorize(Policy ="Admin")]
祝你好运
如果这回答了您的问题,请随时标记为已回答
将 Visual Studio 2019 年提供的 Blazor 模板与身份 4 和个人帐户一起使用。
我在服务器端有这个控制器
[ApiController, Route("api/[controller]")]
public class DataController : Controller
{
[HttpGet, Route("GetUser")]
public async Task<ActionResult<bool>> GetUser()
{
return User?.Identity?.IsAuthenticated;
}
}
在客户端我有一个包含此代码的页面
@page "/User"
@inject HttpClient Http
@userIsLogged
@code {
private bool userIsLogged;
protected override async Task OnInitializedAsync()
{
userIsLogged = await Http.GetFromJsonAsync<bool>("api/data/GetUser");
}
}
如果用户已登录并且我从浏览器进入该页面,我可以看到表明用户已登录的 True 文本。
但是,如果我尝试通过输入 https://localhost:44395/Api/Data/GetUser 直接在浏览器中请求控制器结果,而不使用 HttpClient,即使用户已经登录。
从其他帖子
services.AddAuthentication().AddIdentityServerJwt()
但是我没有找到解决方法。
我的目标是能够使用 HttpClient 从客户端访问已登录用户的身份信息、用户名、角色等,以及直接从浏览器调用 ActionResult。 为了做到这一点,你能指出项目中缺少什么吗?
谢谢 伊格纳西奥
IdentityServer 使用 JWT(Json Web 令牌)来保护其资源(在本例中为 API),同时将应用程序注册为允许访问 Web Api(包含在它的范围内)
所以它在应用程序连接期间工作的原因是 httpclient 发送令牌,如下图所示
另请注意,当您启动应用程序时,Blazor 应用程序将从身份服务器 (OidcConfigurationController) 请求所需的参数 如下图所示
另请参阅返回到 blazor 应用程序的参数,这些参数清楚地显示了范围
所以结论是,是的,您将无法访问您的安全 api,除非它在可以访问它的应用程序中
更新(问题更新后)
您需要在页面中注入以下提供程序
@inject Microsoft.AspNetCore.Components.Authorization.AuthenticationStateProvider AuthenticationStateProvider
然后如下使用
var authState = await AuthenticationStateProvider.GetAuthenticationStateAsync();
user = authState.User;
var claims = user.Claims?.ToList();
此外,如果您想根据 Roles/policy 保护您的网页 您可以在 program.cs
中添加政策如下
builder.Services.AddAuthorizationCore(options =>
{
options.AddPolicy("Admin", policy =>
{
policy.RequireAuthenticatedUser();
policy.RequireRole("Admin");
});
});
然后在您的部分 class 中使用它,如下所示
[Authorize(Policy = "Admin")]
或在您的页面内如下
@using Microsoft.AspNetCore.Authorization
@attribute [Authorize(Policy ="Admin")]
祝你好运
如果这回答了您的问题,请随时标记为已回答