虽然我还没有在生产中使用 ASP.NET 身份(可能在几个月后),但我确实有一个测试项目,它针对内部用户的活动目录进行身份验证。不过,您将不得不推出自己的实现来完成这项工作。
以下是一些简短的示例,展示了我如何以不同的方法访问活动目录:
角色
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
该类,因为它实际上是 Entity Framework 实现使用的默认类(即使我使用 SQL Server,我的数据库架构与默认的 ASP.NET Identity 实现有很大不同,所以我使用自己的模型)。至少你需要实现的是IUser
(这实际上是IdentityUser
实现的)。这是我实施它的方式:
public partial class User : IUser<Guid> {
}
我有另一个同名的部分类,其中包含实体框架使用的所有属性和信息。