asp.net 如何在blazor wasm客户端对用户角色进行授权?

w41d8nur  于 2022-11-19  发布在  .NET
关注(0)|答案(1)|浏览(209)

环境

  • ASP.Net核心5.0
  • Blazor WebAssembly应用程序(Asp.Net核心托管)
  • Asp.Net核心标识(带有标识服务器4)

问题

我想在服务器端和客户端之间使用基于角色的授权。
我可以正确登录,并且UserManager.IsInRoleAsync(user, "admin")在服务器端返回True。
但是@attribute [Authorize(Roles = "admin")]<AuthorizeView Roles="admin">在客户端都不起作用,并且User.Identity.IsInRole("admin")在客户端返回False。
如何在客户端获取用户角色?

代码

服务器.csproj
第一个

客户端.csproj

第一个

yjghlzjz

yjghlzjz1#

目前有two accepted ways处理此问题。
"第一次“

1通过调用AddRoles将身份配置为使用角色

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

2配置身份服务器以将角色声明放入ID令牌和访问令牌中,并阻止JwtSecurityTokenHandler中角色的默认Map。

services.AddIdentityServer()
    .AddApiAuthorization<ApplicationUser, ApplicationDbContext>(options => {
        options.IdentityResources["openid"].UserClaims.Add("role");
        options.ApiResources.Single().UserClaims.Add("role");
    });

// Need to do this as it maps "role" to ClaimTypes.Role and causes issues
JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Remove("role");

3在您的blazor应用上使用[Authorize(Roles =“admin”)]或您的应用定义的任何其他角色。

4在受保护的资源API上使用[Authorize(Roles =“admin”)]或应用定义的任何其他角色。

"第二次“

1在客户端上添加类以配置选项.UserOptions.RoleClaim

using Microsoft.AspNetCore.Components.WebAssembly.Authentication;
using Microsoft.Extensions.Options;

namespace App.Client.Services
{
    public class ApiAuthorizationOptionsConfiguration
        : IPostConfigureOptions<RemoteAuthenticationOptions<ApiAuthorizationProviderOptions>>
    {
        public void Configure(RemoteAuthenticationOptions<ApiAuthorizationProviderOptions> options)
        {
            options.UserOptions.RoleClaim ??= "role";
        }

        public void PostConfigure(string name, RemoteAuthenticationOptions<ApiAuthorizationProviderOptions> options)
        {
            if (string.Equals(name, Options.DefaultName))
            {
                Configure(options);
            }
        }
    }
}

2修改Program.cs文件以调用ApiAuthorizationOptionsConfiguration并配置角色声明。

using App.Client.Services;
...

namespace App.Client
{
    public class Program
    {
        public static async Task Main(string[] args)
        {
            ...

            builder.Services.AddAuthorizationCore();
            builder.Services.AddApiAuthorization();
            builder.Services.TryAddEnumerable(
                ServiceDescriptor.Singleton<
                    IPostConfigureOptions<RemoteAuthenticationOptions<ApiAuthorizationProviderOptions>>,
                    ApiAuthorizationOptionsConfiguration>());

            ...
        }
    }
}

相关问题