【问题标题】:Blazor WASM - Identity RoleClaimsBlazor WASM - 身份角色声明
【发布时间】:2021-07-20 13:10:30
【问题描述】:

在我之前的 MVC 项目中,我使用默认身份页面登录 (/Identity/Account/Login)

通过在我的 Controller.cs 上使用下面的代码,我可以获得各种值,例如当前用户分配到的角色、角色的声明等...

var claims = User.Claims; // or HttpContext.User.Claims

//expected claim values are:

//{the-user-guid}
//email@test.com
//["Admin", "Manager"]
//Permission.Module1.Create    <-- I need this (in Blazor)
//Permission.Module2.Read      <-- I need this (in Blazor)
//and so on...

但是,与 Blazor 具有相同的设置,调用 User.Claims 默认情况下不包括角色和角色的声明。

我能够通过执行this 来包含用户分配到的角色(即管理员、经理)。所以我的下一个目标是获得 RoleClaims(来自 AspNetRoleClaims 表)——这会给我权限。

在来自链接的解决方案的上下文中,我不确定是否可以使用其他“关键字”(“角色”除外)来获得 RoleClaims。如果您能指出包含这些关键字列表的资源,我也将不胜感激。

【问题讨论】:

  • 要访问 AspNetRoleClaims,您可以使用 UserManager 或者您可以注入 dataContext 并立即访问它,查看我更新的答案,它将向您展示如何从控制器访问它

标签: identityserver4 blazor-webassembly


【解决方案1】:

您需要在您的页面中注入以下提供程序

@inject Microsoft.AspNetCore.Components.Authorization.AuthenticationStateProvider AuthenticationStateProvider

然后按如下方式使用

var authState = await AuthenticationStateProvider.GetAuthenticationStateAsync();
            user = authState.User;
            var claims = user.Claims?.ToList();

此外,如果您想根据角色/政策保护您的网页 您可以在 program.cs 中添加策略

如下

builder.Services.AddAuthorizationCore(options =>
            {
                options.AddPolicy("Admin", policy =>
                {
                    policy.RequireAuthenticatedUser();
                    policy.RequireRole("Admin");
                });
                
            });

然后在你的部分类中使用它,如下所示

[Authorize(Policy = "Admin")]

或在您的页面中如下所示

@using Microsoft.AspNetCore.Authorization
@attribute [Authorize(Policy ="Admin")]

祝你好运

2021 年 4 月 28 日编辑

感谢 Majo 的更新

如果要获取控制器内的用户信息 您需要在控制器构造函数中注入 UserManager

private readonly ILogger<WeatherForecastController> _logger;
        private readonly UserManager<ApplicationUser> userManager;

        public WeatherForecastController(ILogger<WeatherForecastController> logger ,
            UserManager<ApplicationUser> userManager)
        {
            _logger = logger;
            this.userManager = userManager;
        }

然后在您的操作中,您将能够使用UserManager 的实例根据需要获取所有声明和角色

在你的行动中,你可以使用这样的东西

var userId = User.FindFirstValue(ClaimTypes.NameIdentifier);  // get the user ID

            var user = await userManager.FindByIdAsync(userId); // get the user object 
            var claims = await     userManager.GetClaimsAsync(user); // get the claims based on the user object 
            var rols = await userManager.GetRolesAsync(user); // get the roles based on the user object 

我希望这能回答你的问题!

问候,

哈立德·德希亚

【讨论】:

  • 您好 Khaled,感谢您的回答。抱歉,我的问题并不清楚。我希望从服务器项目的 MyController.cs 中获取它。我会更新我的问题。
  • @MaJo 我刚刚更新了我的答案,如果您需要任何其他帮助,请告诉我!
猜你喜欢
  • 2018-02-10
  • 2021-11-05
  • 2021-07-16
  • 1970-01-01
  • 2015-04-09
  • 1970-01-01
  • 1970-01-01
  • 2021-07-24
  • 1970-01-01
相关资源
最近更新 更多