在创建MVC项目的时候使用了Microsoft.AspNet.Identity2.0实现用户的登录及后台角色权限控制。
AspNetRoles表自动生成了三个字段。分别是Id,Name,Discriminator
由于后台登录需要初始添加一个系统管理员来进行操作。于是打算用直接数据库插入的方法来实现。
首先在角色表中插入语句:
INSERT INTO dbo.AspNetRoles
( Id ,
Name ,
Discriminator
)
VALUES ( N'admin' , -- Id - nvarchar(128)
N'admin' , -- Name - nvarchar(256)
N'sysAdministrator' -- Description - nvarchar(256)
)
这个意思是就是创建了一个admin的角色。属于这个角色的用户是系统管理员
INSERT INTO dbo.AspNetUserRoles
( UserId, RoleId )
VALUES ( N'a49cc95c-939a-4c8d-a0ab-8e1dab8064e3', -- UserId - nvarchar(128)
N'admin' -- RoleId - nvarchar(128)
)
这个就是把一个用户的ID和admin角色关联起来,表示这个用户是系统管理员。但是,问题出来了,登录后,会跳到无权限的页面。经过各种尝试,然后怀疑没获取到管理员账号的权限。代码如下:
var roles = UserManager.GetRoles(user.Id); EventLog.WriteLog("" + (roles.Count())); foreach (var item in roles) { EventLog.WriteLog("abc:" + item); }
发觉roles.Count()=0,而EventLog.WriteLog("abc:" + item);什么也没输出。意味着没有获取到这个账号的admin角色权限。经过与另一
个登录正常的项目比较,发觉登录正常项目的AspNetRoles表的Discriminator 字段值是ApplicationRole,难道是这里的问题。然后修改这
个字段的值进行尝试。果然,可以正常登录,不再提示没权限了。最后总结,因为Discriminator 是Microsoft.AspNet.Identity自动创建,此
字段应该是系统自动区分是否为角色的保留字段。只能是ApplicationRole值,不能是其他。知道了问题所在,因此为了对权限进行说明,
在此表中增加了description字段来对角色进行简单的说明,问题解决了