我已经阅读了许多关于在MVC5中处理角色管理的Identity方式的博客文章,但大多数似乎都集成了注册系统等。我想知道我是否可以简单地使用角色。
我有一个现有的MVC5项目,我从Active Directory中提取用户并将其存储在自定义用户模型类中。是否可以将Identity Role管理与此类项目集成?
我是ASP.Net MVC的新手,到目前为止,这让我有些头疼。我是否必须使用扩展IdentityUser的模型类?如果是这样,我是否仍然可以使用我的活动目录用户,只需将GUID,电子邮件,名称等映射到该新类,然后使用角色来限制对我的应用程序视图的访问?
答案 0 :(得分:1)
虽然我还没有在生产中使用ASP.NET Identity(可能在几个月内),但我确实有一个测试项目放在一起,针对内部用户对Active Directory进行身份验证。您必须使用自己的实现来完成这项工作。
以下是一些缩短的示例,以说明我如何使用不同的方法访问活动目录:
<强>角色强>
public async Task<IList<string>> GetRolesAsync(User user) {
List<string> roles = new List<string>();
//Active Directory Roles
if (user.Email.Contains("@mycompany")) {
var directory = new CompanyDirectory();
var adGroups = directory.GetGroupsByUser(user.Email);
if (adGroups != null && adGroups.Count > 0) {
roles.AddRange(adGroups);
}
}
//SQL Server Roles
var dbRoles = await _context.Users
.Where(u => u.UserName == user.UserName)
.SelectMany(u => u.Roles)
.Select(r => r.Name)
.ToListAsync();
roles.AddRange(dbRoles);
return roles;
}
<强>验证强>
public override async Task<User> FindAsync(string userName, string password) {
var identityUser = await base.FindByNameAsync(userName);
if (identityUser != null) {
if (userName.EndsWith("@mycompany.net")) {
var directory = new CompanyDirectory();
var isValidated = directory.ValidateUser(userName, password);
if (isValidated) {
return identityUser;
}
} else {
//SQL Server Auth
}
}
return null;
}
您不需要扩展IdentityUser
类,因为它实际上是实体框架实现使用的默认类(即使我使用SQL Server,我的数据库架构与默认ASP有很大不同.NET Identity实现,所以我使用自己的模型)。至少你需要实现的是IUser
(这实际上是IdentityUser
实现的)。以下是我如何实现它:
public partial class User : IUser<Guid> {
}
我有另一个具有相同名称的部分类,其中包含实体框架使用的所有属性和信息。