将 ASP.NET MVC5 标识角色添加到我现有的 Intranet 项目中

本文关键字:Intranet 项目 NET ASP MVC5 标识 添加 角色 | 更新日期: 2023-09-27 17:56:36

我已经阅读了很多关于在MVC5中处理角色管理的标识方式的博客文章,但其中大多数似乎集成了注册系统等。我想知道我是否可以简单地使用角色。

有一个现有的 MVC5 项目,我从 Active Directory 中提取用户并将其存储在自定义用户模型类中。是否可以将标识角色管理与此类项目集成?

我是MVC ASP.Net 新手,到目前为止,这让我有些头疼。我是否必须使用扩展 IdentityUser 的模型类?如果是这样,我是否仍然可以使用我的 Active Directory 用户并简单地将 GUID、电子邮件、名称等映射到该新类,然后使用角色来限制对我的应用程序视图的访问?

将 ASP.NET MVC5 标识角色添加到我现有的 Intranet 项目中

虽然我还没有在生产中使用 ASP.NET Identity(也许在几个月内),但我确实有一个测试项目,它针对内部用户的活动目录进行身份验证。 不过,您必须滚动自己的实现才能完成这项工作。

以下是一些缩短的示例,以显示我如何以不同的方法点击活动目录:

角色

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> {
}

我有另一个同名的分部类,其中包含实体框架使用的所有属性和信息。