ASP.NET Core 2.0 无法检查用户是否在 Razor 视图或控制器 [authorize] 注释中正确扮演角色
ASP.NET Core 2.0 unable to check if user is in role properly in Razor view or controller [authorize] annotation
我正在处理一个基于角色授权的遗留项目,但我遇到了一些问题。 User.IsInRole("admin")
和 [Authorize(Roles = "admin")]
总是授权失败。 User.IsInRole()
总是 returns False
。我很确定用户已正确添加到角色中。 Role name 'admin' is already taken.
User already in role 'admin'.
也许某些服务正在影响另一个。
这是我的 startup.cs 恢复代码:
public void ConfigureServices(IServiceCollection services){
services.AddDbContext<ApplicationDbContext>(options => options.UseMySql(connetctionString));
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
services.AddScoped<IUserClaimsPrincipalFactory<ApplicationUser>, CustomUserClaimsPrincipalFactory>();
services.AddMvc();
services.AddDistributedMemoryCache();
services.AddSession();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env){
app.UseStaticFiles();
app.UseAuthentication();
app.UseMvc(routes => {...});
}
我错过了什么?
PS。是的,我登录并登录了。
PS。是的,用户的角色是 admin
PS。 "admin" 是正确的小写
PS。 ApplicationDbContext 继承IdentityDbContext
Ps2。这是我的数据
SELECT id,username FROM aspnetusers;
|id | username |
|c4f7bf16... | admin@admin.com |
SELECT Id,Name FROM aspnetroles;
|Id | Name |
|50e2a572... | admin |
SELECT * FROM aspnetuserroles;
|UserId | RoleId |
|c4f7bf16... | 50e2a572...|
身份服务器配置为 return 在 authentication.you 之后声明中的角色可以检查控制器中的声明。
像这样
var claims = User.Claims.ToList();
确保您的 ApplicationDbContext 继承了 IdentityDbContext
public class ApplicationDbContext: IdentityDbContext<ApplicationUser>
您的问题还有一个可能,请检查您的角色名称是否为admin
。
对于Authorize
或User.IsInRole
,它是区分大小写的,这意味着如果您的角色名称是Admin
,它将在User.IsInRole("admin")
或[=16]时失败=].
检查是否为 admin
的一种方法,请尝试 await _userManager.IsInRoleAsync(user, "user")
:
var user = await _userManager.FindByNameAsync(User.Identity.Name);
var r1 = User.IsInRole("User");
var r2 = User.IsInRole("user");
var r3 = await _userManager.IsInRoleAsync(user, "user");
您可以尝试将 role
定义为 const 以避免大小写不匹配。
我感觉这是因为你的 Roles
和你的 Claims
在某处混淆了。
根据 the docs,ClaimsPrincipal.IsInRole() 方法检查 ClaimsIdentity.RoleClaimType
.
类型的声明
可以设置 "admin" 的 Claim 而不是 ClaimType ClaimsIdentity.RoleClaimType
,在这种情况下它将无法通过身份验证。
经过很多错误,我终于找到了我遗漏的东西。
我只扩展了 UserClaimsPrincipalFactory<ApplicationUser>
而不是 UserClaimsPrincipalFactory<ApplicationUser, IdentityRole>
。
正确扩展角色后可以claimend。
public class MyUserClaimsPrincipalFactory : UserClaimsPrincipalFactory<ApplicationUser, IdentityRole>
我正在处理一个基于角色授权的遗留项目,但我遇到了一些问题。 User.IsInRole("admin")
和 [Authorize(Roles = "admin")]
总是授权失败。 User.IsInRole()
总是 returns False
。我很确定用户已正确添加到角色中。 Role name 'admin' is already taken.
User already in role 'admin'.
也许某些服务正在影响另一个。
这是我的 startup.cs 恢复代码:
public void ConfigureServices(IServiceCollection services){
services.AddDbContext<ApplicationDbContext>(options => options.UseMySql(connetctionString));
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
services.AddScoped<IUserClaimsPrincipalFactory<ApplicationUser>, CustomUserClaimsPrincipalFactory>();
services.AddMvc();
services.AddDistributedMemoryCache();
services.AddSession();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env){
app.UseStaticFiles();
app.UseAuthentication();
app.UseMvc(routes => {...});
}
我错过了什么?
PS。是的,我登录并登录了。
PS。是的,用户的角色是 admin
PS。 "admin" 是正确的小写
PS。 ApplicationDbContext 继承IdentityDbContext
Ps2。这是我的数据
SELECT id,username FROM aspnetusers;
|id | username |
|c4f7bf16... | admin@admin.com |
SELECT Id,Name FROM aspnetroles;
|Id | Name |
|50e2a572... | admin |
SELECT * FROM aspnetuserroles;
|UserId | RoleId |
|c4f7bf16... | 50e2a572...|
身份服务器配置为 return 在 authentication.you 之后声明中的角色可以检查控制器中的声明。
像这样
var claims = User.Claims.ToList();
确保您的 ApplicationDbContext 继承了 IdentityDbContext
public class ApplicationDbContext: IdentityDbContext<ApplicationUser>
您的问题还有一个可能,请检查您的角色名称是否为admin
。
对于Authorize
或User.IsInRole
,它是区分大小写的,这意味着如果您的角色名称是Admin
,它将在User.IsInRole("admin")
或[=16]时失败=].
检查是否为 admin
的一种方法,请尝试 await _userManager.IsInRoleAsync(user, "user")
:
var user = await _userManager.FindByNameAsync(User.Identity.Name);
var r1 = User.IsInRole("User");
var r2 = User.IsInRole("user");
var r3 = await _userManager.IsInRoleAsync(user, "user");
您可以尝试将 role
定义为 const 以避免大小写不匹配。
我感觉这是因为你的 Roles
和你的 Claims
在某处混淆了。
根据 the docs,ClaimsPrincipal.IsInRole() 方法检查 ClaimsIdentity.RoleClaimType
.
可以设置 "admin" 的 Claim 而不是 ClaimType ClaimsIdentity.RoleClaimType
,在这种情况下它将无法通过身份验证。
经过很多错误,我终于找到了我遗漏的东西。
我只扩展了 UserClaimsPrincipalFactory<ApplicationUser>
而不是 UserClaimsPrincipalFactory<ApplicationUser, IdentityRole>
。
正确扩展角色后可以claimend。
public class MyUserClaimsPrincipalFactory : UserClaimsPrincipalFactory<ApplicationUser, IdentityRole>