我正在使用實體框架實現使用ASP.NET身份2.1.0。
身份驗證正常,但基於角色的安全性存在問題。 雖然我已經添加了角色的用戶,但該代碼返回空:授權和GetRoles在ASP.NET身份不起作用
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身份的其他樣本
我用這個代碼添加默認的admin用戶和角色中看到:
public static void Start()
{
var userManager = HttpContext.Current.GetOwinContext().GetUserManager<BasemapUserManager>();
var roleManager = HttpContext.Current.GetOwinContext().Get<ApplicationRoleManager>();
const string name = "[email protected]";
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表中的記錄包含空值:
爲什麼GetRoles不會爲在數據庫中具有該角色的用戶返回任何內容? IsInRole等其他API也無法按預期工作。是否因爲添加到IdentityUserRoles表的外鍵?
這是什麼'BasemapUser.GenerateUserIdentityAsync'回報? 'ClaimsIdentity'對象在'.Claims'屬性中返回的是什麼? – trailmax 2014-10-20 09:03:54
@trailmax我沒有使用過。它只是從Nuget中的ASP.NET Identity的示例中獲得的。 – Shahin 2014-10-20 09:21:52
不確定樣品是什麼 - 沒有看過它一段時間。但它看起來像你從框架中得到的'ClaimsPrincipal'沒有角色,因爲聲明附加(它應該)。在您的登錄控制器中,嘗試添加此代碼並查看生成的「Claims」列表是否具有所需的角色。 – trailmax 2014-10-20 09:29:02