【问题标题】:How to add additional claims to Blazor WebAssembly 3.2.0 Preview 3 application如何向 Blazor WebAssembly 3.2.0 Preview 3 应用程序添加附加声明
【发布时间】:2020-07-25 11:14:41
【问题描述】:

我创建了一个 Asp.Net Core 托管的 Blazor webassembly 3.2.0 Preview 3 应用程序,其中包含应用程序内帐户的身份验证选项。然后,我向 ApplicationUser 类添加了一些附加属性,并将这些更改迁移到数据库。然后我实现了一个自定义声明工厂,如下所示:

public class MyCustomUserClaimsPrincipalFactory : UserClaimsPrincipalFactory<ApplicationUser>
{
    public MyCustomUserClaimsPrincipalFactory(
        UserManager<ApplicationUser> userManager,
        IOptions<IdentityOptions> optionsAccessor)
            : base(userManager, optionsAccessor)
    {
    }

    protected override async Task<ClaimsIdentity> GenerateClaimsAsync(ApplicationUser user)
    {
        var identity = await base.GenerateClaimsAsync(user);
        identity.AddClaim(new Claim(ClaimTypes.GivenName, user.FirstName ?? string.Empty));
        .....

        return identity;
    }
}

并像这样在服务器应用程序中注册声明工厂:

services.AddDefaultIdentity<ApplicationUser>(options => options.SignIn.RequireConfirmedAccount = true)
            .AddEntityFrameworkStores<ApplicationDbContext>()
            .AddClaimsPrincipalFactory<MyCustomUserClaimsPrincipalFactory>();

但是,当我在客户端 Web 应用程序组件中列出声明时,我没有看到我在自定义声明工厂中添加的任何其他声明。我用来列出索赔的代码是:

<AuthorizeView>
   <Authorized>
    <ul>
        @foreach (var claim in context.User.Claims)
        {
            <li><span>@claim.Type</span><span>@claim.Value</span></li>
        }
    </ul>
   </Authorized>
</AuthorizeView>

我确认正在调用声明工厂代码。如何在客户端 Web 应用中获取额外声明?

编辑:我什至尝试过使用 ClaimsTransformer(建议 here),但我仍然没有看到额外的声明

【问题讨论】:

  • 我面临着完全相同的问题。你找到解决办法了吗?
  • 我已经创建了一个 github 存储库,并使其适用于 Blazor WebAssembly 3.2.0。 / .NET & EF 5 Preview - Multiple Roles and Additional User Claims 请参阅:github.com/JeepNL/Blazor-WASM-Identity-gRPC

标签: blazor-client-side


【解决方案1】:

我在这个线程上遵循了 dfkeenan 的说明: https://github.com/dotnet/aspnetcore/issues/20887

我添加了一个 ProfileService,我在上面添加了我需要的声明(CompanyName、CompanyID)

public class ProfileService : IProfileService
{
    public ProfileService()
    {
    }

    public 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);
        context.IssuedClaims.AddRange(context.Subject.FindAll("CompanyName"));
        context.IssuedClaims.AddRange(context.Subject.FindAll("CompanyId"));

        return Task.CompletedTask;
    }

    public Task IsActiveAsync(IsActiveContext context)
    {
        return Task.CompletedTask;
    }
}

然后注册

services.AddTransient&lt;IProfileService, ProfileService&gt;();

关于配置服务

【讨论】:

    猜你喜欢
    • 2020-12-31
    • 1970-01-01
    • 2020-07-18
    • 2020-11-17
    • 1970-01-01
    • 1970-01-01
    • 2020-07-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多