代码之家  ›  专栏  ›  技术社区  ›  John D

Blazor WASM CORE-6角色验证不适用于我

  •  0
  • John D  · 技术社区  · 4 年前

    我的项目是在VS-2022和使用下面的标签。

    有人能解释一下是什么吗 code-snippet reference 下面的意思是在SERVER程序.cs文件中?这个片段打算“做什么”?
    具体来说,“名称”和“角色”指的是什么?我已经在AspNetRoles表中创建了四个角色,还创建了AspNetrolClaims和AspNetUserClaims。但是,以下Blazor页面条件不起作用: @attribute [Authorize(Roles = "Owner,Admin,Lead,User")]

    我在一个建议中发现了以下代码段,我需要这些代码来获得角色授权工作。

    使用时,我在包含以下内容的行上得到运行时错误“Sequence contains no elements”: options.ApiResources.Single().UserClaims.Add("name");

    由于阅读的原因,我无法知道program.cs文件部分(以前称为startup.cs)中需要什么。NET Core 3.1和。NET 5在线教程,让我的项目进入。NET 6和WASM托管。与过去的两年相比,情况发生了很大变化,尤其是与Blazor和。NET 6。

    我欢迎有关在我的项目中获得角色授权的问题、评论和解决方案。

    builder.Services.AddIdentityServer()
            .AddApiAuthorization<ApplicationUser, ApplicationDbContext>(options => {
               options.IdentityResources["openid"].UserClaims.Add("name");
               options.ApiResources.Single().UserClaims.Add("name");
               options.IdentityResources["openid"].UserClaims.Add("role");
               options.ApiResources.Single().UserClaims.Add("role");
            });
    
    JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Remove("role");
    
    0 回复  |  直到 4 年前
        1
  •  0
  •   Tasos K. Sagar Jaybhay    4 年前

    有太多太聪明的变化。

    试试这个官方文档。

    Name and role claim with API authorization

    配置文件服务一个。

    在服务器项目下创建ProfileService.cs。

    using IdentityModel;
    using Duende.IdentityServer.Models;
    using Duende.IdentityServer.Services;
    using System.Threading.Tasks;
    
    public class ProfileService : IProfileService
    {
        public ProfileService()
        {
        }
    
        public async Task GetProfileDataAsync(ProfileDataRequestContext context)
        {
            var nameClaim = context.Subject.FindAll(JwtClaimTypes.Name);
            context.IssuedClaims.AddRange(nameClaim);
    
            var roleClaims = context.Subject.FindAll(JwtClaimTypes.Role);
            context.IssuedClaims.AddRange(roleClaims);
    
            await Task.CompletedTask;
        }
    
        public async Task IsActiveAsync(IsActiveContext context)
        {
            await Task.CompletedTask;
        }
    }