C# AuthorizeView策略:Blazor页面未显示

C# AuthorizeView策略:Blazor页面未显示,c#,asp.net,identityserver4,blazor,blazor-server-side,C#,Asp.net,Identityserver4,Blazor,Blazor Server Side,IdentityServer返回AuthenticationScheme:禁止承载 我检查了AccessToken,它包含scope account.read,但是blazor不显示页面 我错过什么了吗 Startup.cs Blazor页面 这是框架中的一个全局性问题,尚未解决。该问题是由于目前缺乏对Blazor的支持,无法读取以数组形式发送的声明 e、 g.用户:[c、r、u、d] 无法阅读 要纠正此问题,您需要添加ClaimsPrincipalFactory e、 g 然后,根据您是否使用

IdentityServer返回AuthenticationScheme:禁止承载

我检查了AccessToken,它包含scope account.read,但是blazor不显示页面

我错过什么了吗

Startup.cs

Blazor页面


这是框架中的一个全局性问题,尚未解决。

该问题是由于目前缺乏对Blazor的支持,无法读取以数组形式发送的声明

e、 g.用户:[c、r、u、d]

无法阅读

要纠正此问题,您需要添加ClaimsPrincipalFactory

e、 g

然后,根据您是否使用.core托管,在您的程序/初创公司中注册此项:

builder.Services.AddOidcAuthentication(options =>
        {
            builder.Configuration.Bind("oidc", options.ProviderOptions);
        })
        .AddAccountClaimsPrincipalFactory<ArrayClaimsPrincipalFactory<RemoteUserAccount>>();

为了改进这个答案,如果你能为此添加一个引文,并在你的答案中引用相关部分,这将是非常有用的
<AuthorizeView> <p> you are logged in </p> <AuthorizeView>
<AuthorizeView Policy="AccountRead">
<p> you have account.read access </p>
</AuthorizeView>
public class ArrayClaimsPrincipalFactory<TAccount> : AccountClaimsPrincipalFactory<TAccount> where TAccount : RemoteUserAccount
{
    public ArrayClaimsPrincipalFactory(IAccessTokenProviderAccessor accessor)
    : base(accessor)
    { }


    // when a user belongs to multiple roles, IS4 returns a single claim with a serialised array of values
    // this class improves the original factory by deserializing the claims in the correct way
    public async override ValueTask<ClaimsPrincipal> CreateUserAsync(TAccount account, RemoteAuthenticationUserOptions options)
    {
        var user = await base.CreateUserAsync(account, options);

        var claimsIdentity = (ClaimsIdentity)user.Identity;

        if (account != null)
        {
            foreach (var kvp in account.AdditionalProperties)
            {
                var name = kvp.Key;
                var value = kvp.Value;
                if (value != null &&
                    (value is JsonElement element && element.ValueKind == JsonValueKind.Array))
                {
                    claimsIdentity.RemoveClaim(claimsIdentity.FindFirst(kvp.Key));

                    var claims = element.EnumerateArray()
                        .Select(x => new Claim(kvp.Key, x.ToString()));

                    claimsIdentity.AddClaims(claims);
                }
            }
        }

        return user;
    }
}
builder.Services.AddOidcAuthentication(options =>
        {
            builder.Configuration.Bind("oidc", options.ProviderOptions);
        })
        .AddAccountClaimsPrincipalFactory<ArrayClaimsPrincipalFactory<RemoteUserAccount>>();