ASP.NET将Windows身份验证与自定义应用程序组/角色组合

时间:2017-02-21 21:08:05

标签: c# asp.net asp.net-mvc authentication active-directory

完全披露,我不完全了解Windows身份验证,活动目录和LDAP的世界,并且通过sql server对个人用户帐户几乎没有经验。此外,我发现Web上的大多数文档,特别是Microsoft提出的文档,都假设您在纯Microsoft世界中开发,并且能够实现它们提供的最新和任何解决方案,框架或服务。

我正在开发一个Intranet应用程序。由于各种原因,我无法利用Active Directory组/角色,但希望尽可能多地模仿此功能。因此,我需要能够在应用程序内部管理用户/角色/组。但是,我希望能够在此过程中检测用户的Windows身份验证凭据。换句话说,我不希望用户必须注册,也不希望他们必须登录,而是使用他们登录的Windows帐户。

然后,应用程序托管角色将确定用户在应用程序中将具有的各种功能。

这是一个asp.net MVC应用程序。我最终需要满足以下有关授权的要求。

1)将当前Windows用户与应用程序用户存储和角色进行比较。可以使用SQL服务器。

2)根据用户角色操作功能

3)允许管理员搜索AD并将域\用户添加到商店以及分配组

4)创建组并注册应用程序组件

关于如何处理这些或所有这些问题的任何信息都将非常有益。

3 个答案:

答案 0 :(得分:3)

您正在寻找的是自定义角色提供程序。 这非常简单易行。只需创建一个继承自System.Web.Security.RoleProvider的类。您需要实现的唯一方法是IsUserInRole和GetRolesForUser。 您可能只是在所有其他方法上抛出NotImplementedException。 然后,通过在System.Web。

下设置roleManager元素,将其绑定到Web.Config中的应用程序
public class CustomRoleProvider : RoleProvider
{
    private mydatabase db;

    public override string ApplicationName { get; set; }

    public CustomRoleProvider()
    {
        db = new mydatabase();
    }

    public override bool IsUserInRole(string username, string roleName)
    {
        //This will return the user object.
        //To get the username of the logged on user, you can use User.Identity.Name
        //To remove the domain name from the username: User.Identity.Name.Split('\\').Last();
        var user = db.CurrentUser();

        return user.Roles != null
            && user.Roles.Count > 0
            && (user.Roles.Exists(x => x.Roles.RoleNm == roleName));
    }

    public override string[] GetRolesForUser(string username)
    {
        var user = db.CurrentUser();

        return user.Roles.Select(x => x.Roles.RoleNm).ToArray();
    }

    #region not implemented

    public override void AddUsersToRoles(string[] usernames, string[] roleNames)
    {
        throw new NotImplementedException();
    }

    public override void CreateRole(string roleName)
    {
        throw new NotImplementedException();
    }

    public override bool DeleteRole(string roleName, bool throwOnPopulatedRole)
    {
        throw new NotImplementedException();
    }

    public override string[] FindUsersInRole(string roleName, string usernameToMatch)
    {
        throw new NotImplementedException();
    }

    public override string[] GetAllRoles()
    {
        throw new NotImplementedException();
    }

    public override string[] GetUsersInRole(string roleName)
    {
        throw new NotImplementedException();
    }

    public override void RemoveUsersFromRoles(string[] usernames, string[] roleNames)
    {
        throw new NotImplementedException();
    }

    public override bool RoleExists(string roleName)
    {
        throw new NotImplementedException();
    }

    #endregion
}

然后,在Web.Config

<system.web>
    <roleManager defaultProvider="CustomRoleProvider" enabled="true">
      <providers>
          <clear />
          <add name="CustomRoleProvider" type="ThisProject.CustomRoleProvider, ThisProject" />
      </providers>
    </roleManager>
</system.web>

免责声明:此代码中可能存在拼写错误,但您应该能够获得这个问题

答案 1 :(得分:0)

有专门为ActiveDirectory创建的成员资格提供程序:

https://msdn.microsoft.com/en-us/library/system.web.security.activedirectorymembershipprovider(v=vs.110).aspx

您可以在应用中实施该提供商。此外,如果您需要ActiveDirectoryMembershipProvider未提供的其他功能,您可以创建自己的会员提供商:

https://msdn.microsoft.com/en-us/library/f1kyba5e.aspx

答案 2 :(得分:0)

Asp.Net Identity将身份和授权分为两个不同的组件。

根据设计,您可以选择将AD标识片与Asp.Net授权片一起使用。这样您就可以使用本地AD令牌来识别用户所在的WHO,然后使用该令牌根据该身份为其分配权限(角色和/或声明)。与您如何使用Google,Facebook或Twitter身份类似。 显然,如果您的AD当局不允许您查询AD以及#34;谁是令牌X后面的用户&#34;那么这个答案没有实际意义。

我现在还没有时间进一步研究这个问题,但我认为这应该会让你朝着正确的方向前进。

(警告:你可能会被限制使用微软浏览器。最后我看起来只有IE会发送带有HttpRequest的Active Directory令牌,如果请求被发送到本地域服务器(又名&#39; intranet&#) 39;区域。。我听说Chrome会允许你配置它也可以这样做,但从来没有真正做过。)