簡體   English   中英

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

[英]Authorize and GetRoles doesn't work in ASP.NET Identity

我正在使用使用實體框架實現的ASP.NET Identity 2.1.0。
身份驗證工作正常,但基於角色的安全性存在問題。 盡管我已經向用戶添加了角色,但是此代碼返回空值:

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

同樣,基於登錄用戶角色的授權也會失敗。 當用戶重定向到如下所示的控制器時,應用程序會將其重定向到登錄頁面。

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

為了添加ASP.NET身份,首先,我創建了自定義用戶類來添加配置文件數據:

    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遷移命令創建了數據庫。 我在IdentityUserRoles表中看到了兩個額外的列,這在ASP.NET身份的其他示例中都沒有看到

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);

        }
    }

管理員用戶和角色已成功存儲在數據庫中,但IdentityUserRoles表中存儲的記錄包含null值:

空值

為什么GetRoles對於在數據庫中具有該角色的用戶不返回任何內容? 另外,其他API(例如IsInRole)也無法按預期運行。 是否因為添加到IdentityUserRoles表的外鍵?

問題是添加到身份表中的不必要的列。

由於DbContext是從IdentityDbContext擴展的,因此我必須調用base.OnModelCreating,因為IdentityDbContext定義了它以映射Identity類。 我沒有在導致問題的代碼中調用它

    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
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM