在 .net 6 blazor 应用程序中进行身份验证后,如何将自定义声明添加到 ClaimsPrincipal?

Mik*_*ike 2 authorization claims policies asp.net-core blazor

https://learn.microsoft.com/en-us/aspnet/core/security/authorization/claims?source=recommendations&view=aspnetcore-7.0

上面的文章很好地解释了如何通过注册映射到声明的策略来利用声明,并使用这些策略来控制对各种端点的访问。

然而,当涉及到定义声明或向身份添加声明时,本文提供的只是:

创建身份时,可能会为其分配由受信任方发出的一项或多项声明。

我们的声明可以通过 sql 查询访问,我想在身份验证后立即将用户声明嵌入到他们的 ClaimsPrincipal 中。

我见过通过中间件修改身份对象上的声明的示例。但是,中间件将在每个请求上执行,我不想从数据库中获取数据并修改每个请求的声明。我宁愿一开始就执行一次,并且能够利用本机授权 api 端点和 blazor 组件的属性。

我见过的其他示例涉及在 blazor 客户端项目上实现自定义 AccountClaimsPrincipalFactory。这确实为我提供了一种在 CreateUserAsync 中附加我自己的自定义声明的方法,该声明将在身份验证时调用一次。然而,当涉及到注入依赖项以允许我进行必要的 api 调用来获取声明时,我无法在不破坏应用程序的情况下实现我自己的构造函数。从我看到的其他帖子来看,除了依赖注入之外,从该方法中进行 http 调用似乎存在挑战。

任何人都可以向我指出在 .net core blazor 应用程序中添加一次且仅一次自定义声明的任何实现的方向吗?

MrC*_*tis 7

AuthenticationStateProvider您可以像这样创建自定义:

用户是一个ClaimsPrincipal可以拥有ClaimsIdentity任意多个对象的对象。

public class CustomAuthenticationStateProvider : ServerAuthenticationStateProvider
{
    public override async Task<AuthenticationState> GetAuthenticationStateAsync()
    {
        var authState = await base.GetAuthenticationStateAsync();
        var user = authState.User;
        
        // Get your custom data - in this case some roles

        // add some new identities to the Claims Principal
        user.AddIdentity(new ClaimsIdentity(new List<Claim>() { new Claim(ClaimTypes.Role, "Admin") }));
        user.AddIdentity(new ClaimsIdentity(new List<Claim>() { new Claim(ClaimTypes.Role, "User") }));

        // return the modified principal
        return await Task.FromResult(new AuthenticationState(user));
    }
}
Run Code Online (Sandbox Code Playgroud)

并最后注册Program