我已经在2.1之前多次实现了基于角色的身份验证。按照步骤搭建新的2.1身份。
我扩展了IdentityUser模型以添加其他字段,登录工作正常,并且存在新字段。
startup.cs配置服务包含
services.AddDefaultIdentity<AppUser>()
.AddRoles<IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>();
我播下了角色
IdentityRole role = new IdentityRole();
role.Name = "Administrator";
IdentityResult roleResult = roleManager.
CreateAsync(role).Result;
然后创建一个用户并添加到角色中
AppUser user = new AppUser();
user.UserName = "Admin";
user.Email = "admin@admin.com";
user.Name = "Administrator";
user.LockoutEnabled = false;
user.EmailConfirmed = true;
IdentityResult result = userManager.CreateAsync(user, "password").Result;
if (result.Succeeded)
{
userManager.AddToRoleAsync(user, "Administrator").Wait();
}
一切都成功了,数据库看起来还不错(AspNetUserRoles有链接)
但是,用角色装饰控制器将始终返回未经授权的状态
[Authorize(Roles = "Administrator")]
但是,使用
[Authorize]
(无角色)的简单登录检查将起作用。如何解决此问题/什么是合并源代码的最简单方法,以便我可以逐步调试
[Authorize]
标记? 最佳答案
怎么修
但是,用角色装饰控制器将始终返回未经授权的状态
[Authorize(Roles = "Administrator")]
这是
2.1
版本中的一个已知错误。参见issue此处。我遵循了of using the old api suggested by HaoK and C-BERBER的建议,它现在可以正常工作了。
这是我的
DbContext
:public class ApplicationDbContext : IdentityDbContext<AppUser,IdentityRole,string>
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{
}
}
使用旧式api配置身份:
services.AddIdentity<AppUser, IdentityRole>()
.AddRoleManager<RoleManager<IdentityRole>>()
.AddDefaultUI()
.AddDefaultTokenProviders()
.AddEntityFrameworkStores<ApplicationDbContext>();
最后,注销并重新登录,它现在将按预期工作。
如何调试源代码
我猜您不会调试
AuthorizeAttribe
本身,因为它是在编译时处理的。如果要调试AuthorizeFilter
,可以按照以下步骤操作:点击
Tools
-> Options
-> Debugging
在
General
中,在Visual Studio中取消选择Enable Just My Code
选择
Enable Source Link Support
在
Symbols
中,确保已选择Microsoft Symbol Servers。现在,您可以调试源代码了。但是,由于筛选器的工作方式,您需要在MVC之前设置一个断点。我只是设置了一个虚拟的中间件,该中间件将在MVC路由器处理程序之前进行:
调试
AuthorizeFiler
的屏幕截图:关于asp.net-core - .net核心身份2.1角色授权不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52526186/