gpt4 book ai didi

c# - Authorize 和 GetRoles 在 ASP.NET Identity 中不起作用

转载 作者:行者123 更新时间:2023-11-30 20:46:48 26 4
gpt4 key购买 nike

我正在使用 Entity Framework 实现的 ASP.NET Identity 2.1.0。
身份验证工作正常,但基于角色的安全性存在问题。虽然我已经为用户添加了角色,但此代码返回空:

  var roles= UserManager.GetRoles(User.Identity.GetUserId());

此外,基于已登录用户角色的授权也会失败。当用户重定向到如下所示的 Controller 时,应用程序会将他重定向到登录页面。

  [Authorize(Roles = "Admin")]
public abstract partial class AdminAreaController : Controller
{

为了添加 ASP.NET Identity,首先,我创建了自定义用户类来添加配置文件数据:

    public class BasemapUser : IdentityUser
{
[MaxLength(100)]
public string Name { get; set; }

[MaxLength(100)]
public string CompanyName { get; set; }

public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<BasemapUser> manager)
{
// Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
ClaimsIdentity userIdentity =
await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
// Add custom user claims here
return userIdentity;
}
}

这是 DbContext 类:

    public class WebCoreMapDbContext : IdentityDbContext<BasemapUser>
{
public WebDbContext()
: base("WebDbContext")
{
}

public static WebCoreMapDbContext Create()
{
return new WebCoreMapDbContext();
}


protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<IdentityUserLogin>().HasKey<string>(l => l.UserId);
modelBuilder.Entity<IdentityUserRole>().HasKey(r => new {r.RoleId, r.UserId});
}
}

我在 Power Shell 中使用 EF Migration 命令创建了数据库。我在 IdentityUserRoles 表中看到了两个额外的列,这是我在其他 ASP.NET 身份示例中没有看到的

Extra columns in IdentityUserRoles

我使用此代码添加默认管理员用户和角色:

        public static void Start()
{
var userManager = HttpContext.Current.GetOwinContext().GetUserManager<BasemapUserManager>();
var roleManager = HttpContext.Current.GetOwinContext().Get<ApplicationRoleManager>();
const string name = "someEmail@gmail.com";
const string password = "somePassword";
const string roleName = "Admin";

//Create Role Admin if it does not exist
IdentityRole role = roleManager.FindByName(roleName);
if (role == null)
{
role = new IdentityRole(roleName);
IdentityResult roleresult = roleManager.Create(role);
}

BasemapUser user = userManager.FindByName(name);
if (user == null)
{
user = new BasemapUser {UserName = name, Email = name};
IdentityResult result = userManager.Create(user, password);
result = userManager.SetLockoutEnabled(user.Id, false);
}

// Add user admin to Role Admin if not already added
IList<string> rolesForUser = userManager.GetRoles(user.Id);
if (!rolesForUser.Contains(role.Name))
{
IdentityResult result = userManager.AddToRole(user.Id, role.Name);

}
}

Admin 用户和角色已成功存储在数据库中,但 IdentityUserRoles 表中存储的记录包含空值:

Null value

为什么 GetRoles 不会为在数据库中具有该角色的用户返回任何内容? IsInRole 等其他 API 也无法按预期工作。是因为添加到 IdentityUserRoles 表的外键吗?

最佳答案

问题是添加到身份表中的不必要的列。

由于 DbContext 从 IdentityDbContext 扩展而来,我必须调用 base.OnModelCreating,因为 IdentityDbContext 将其定义为映射标识类。我没有在导致问题的代码中调用它

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<IdentityUserLogin>().HasKey<string>(l => l.UserId);
modelBuilder.Entity<IdentityUserRole>().HasKey(r => new {r.RoleId, r.UserId});
}

必须更改为

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);

// modelBuilder.Entity<IdentityUserLogin>().HasKey<string>(l => l.UserId); // do not add this
// modelBuilder.Entity<IdentityUserRole>().HasKey(r => new {r.RoleId, r.UserId}); // do not add this
// other mapping codes
}

关于c# - Authorize 和 GetRoles 在 ASP.NET Identity 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26461703/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com