abp - “授权失败!给定策略尚未授予。” 手动添加声明时
问题描述
我无法使授权策略与 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);
}
};
});
}
解决方案
抱歉,没有时间查看您的特定示例,但也许我可以告诉您在哪里查看。在“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”)
推荐阅读
- excel - 运行 Application.ExecuteExcel4Macro "Show.ToolBar(""Ribbon"",False)" 时隐藏 excel 徽标
- python - 等到用户单击 Matplotlib 图中的按钮以继续程序
- java - 如何使用 selenium 在表格内定位工具提示工具提示值
- javascript - 错误类型错误:无法读取未定义的属性“列表”
- mongodb - Mongodb分组并使用空数组推送
- android - 等待该片段可见的正确方法
- angular - 安装@angular/flex-layout 包问题后启动服务器时出错
- javascript - javascript中未定义街道错误
- c# - Xamarin Android 无法接收举手通知(横幅通知)
- gnuradio - 在不同的端口 gnuradio 上有不同的输出项目编号