首页 > 解决方案 > “授权失败!给定策略尚未授予。” 手动添加声明时

问题描述

我无法使授权策略与 AddJwtBearer 的 OnTokenValidated 事件一起使用,我尝试像PasswordlessAuthentication示例一样将声明设置为用户。我已经有有效的令牌,如果不存在,我正在尝试保存用户并添加具有相应权限的角色。但我总是从端点“授权失败!给定策略未授予。[ApplicationName].Category”收到错误。我们还能做什么?

这是我的 ConfigureAuthentication() 的样子,配置中间件与模板没有变化。

private void ConfigureAuthentication(ServiceConfigurationContext context, IConfiguration configuration)
    {
        context.Services.AddAuthentication()                
            .AddJwtBearer(options =>
            {
                options.Authority = "https://securetoken.google.com/zzzz";
                options.TokenValidationParameters = new TokenValidationParameters
                {
                    ValidateIssuer = true,
                    ValidIssuer = "https://securetoken.google.com/zzzz",
                    ValidateAudience = true,
                    ValidAudience = "zzzz",
                    ValidateLifetime = true,
                };
                options.SaveToken = true;
                options.RequireHttpsMetadata = false;
                options.IncludeErrorDetails = true;

                options.Events = new JwtBearerEvents
                {
                    OnTokenValidated = async context =>
                    {
                        var userService = context.HttpContext.RequestServices.GetService<IdentityUserManager>();
                        var email = context.Principal.Claims.Where(x => x.Type == AbpClaimTypes.Email).FirstOrDefault().Value;
                        IdentityUser user = await userService.FindByEmailAsync(email);

                        if (user == null)
                        {
                            user = new IdentityUser(Guid.NewGuid(), email, email);
                            await userService.CreateAsync(user);
                        }

                        await userService.UpdateSecurityStampAsync(user);

                        var roles = await userService.GetRolesAsync(user);

                        var claims = new List<Claim>
                            {
                            new Claim("sub", user.Id.ToString()),
                            new Claim(AbpClaimTypes.UserId, user.Id.ToString()),
                            new Claim(AbpClaimTypes.Email, user.Email),
                            new Claim(AbpClaimTypes.UserName, user.UserName),
                            new Claim(AbpClaimTypes.EmailVerified, user.EmailConfirmed.ToString().ToLower()),
                            };

                        foreach (var role in roles)
                        {
                            claims.Add(new Claim(AbpClaimTypes.Role, role));
                        }

                        var principal = new ClaimsPrincipal(
                            new ClaimsIdentity(claims, Microsoft.AspNetCore.Identity.IdentityConstants.ApplicationScheme));

                        await context.HttpContext.SignInAsync(principal);
                    }
                };
            });
    }

标签: abp

解决方案


抱歉,没有时间查看您的特定示例,但也许我可以告诉您在哪里查看。在“Volo.Abp.Authorization”项目中引发异常 在此处输入图像描述

它与 abp.io权限系统有关

简而言之,这就是您添加它的方式(在此处创建策略名称)

   /*
    A permission is a simple policy that is granted or prohibited for a particular user, role or client.
    ABP automatically discovers this class. No additional configuration required!
*/
public class TestPermissionDefinitionProvider : PermissionDefinitionProvider
{
    public override void Define(IPermissionDefinitionContext context)
    {
        var myGroup = context.AddGroup("Test", L("Permission:Test"));
        myGroup.AddPermission("Test.Products", L("Permission:ProductManagement"));
        //...
    }

这就是您在应用程序服务中使用它的方式 在此处输入图像描述

因此,如果当前用户没有该策略,您将获得异常。通常策略设置为角色,因此当您创建新用户时,您会为其分配角色(例如“管理员”)。您可以通过 Web 界面和数据库检查特定角色是否具有给定策略(表“AbpPermissionGrants”)


推荐阅读