【问题标题】:Active Directory Authentication with Local-Role-Based Authorization具有基于本地角色的授权的 Active Directory 身份验证
【发布时间】:2015-03-20 02:36:25
【问题描述】:

我正在开发一个 ASP.NET MVC 应用程序。我需要支持多种身份验证机制(这个应用程序被多个客户使用,每个客户都有自己首选的身份验证提供商)。一个身份验证提供程序将是 Active Directory。用于身份验证的 AD 集成很简单,我对此没有任何问题。

对于授权,角色将存储在本地数据库中(注意:我们不能使用 Active Directory 组进行授权 - 角色需要是本地应用程序角色,因为我们支持多个身份验证提供程序并且 AD 管理员不想创建自定义AD 中的组仅适用于我们的应用程序)。我的期望是,我们需要在本地数据库中创建“存根”用户帐户,以便执行 User-is-assigned-which-Roles 映射。这些存根用户帐户还将用于指示哪些用户有权访问应用程序(不是 AD 数据库中的每个人都应该有权访问)。

预期的控制流程将是:

  1. 用户访问登录页面 > 输入凭据 > 将凭据发布到应用服务器。
  2. 应用程序根据 AD 验证凭据。此时,我们知道用户是否通过了身份验证。
  3. 应用程序检查用户的 SID 以查看本地数据库中是否存在具有该 SID 的“存根”用户帐户。如果没有,应用会向用户显示“未授权”错误消息。
  4. 应用将在本地数据库 user-is-assigned-which-roles 表中查找用户的角色。

包括角色在内的用户身份信息将存储为声明,应用将使用典型的基于声明的授权(即 ClaimsAuthorizationManager)。

我的问题是在我的本地数据库中创建“存根”用户帐户的最佳方法是什么?我的猜测是我们应该使用某种 AD 导出脚本来为那些应该被授予访问 ASP.NET 应用程序的用户导出 AD 帐户,然后将这些用户导入本地数据库(注意:我希望存根帐户将包含最少的信息 - 可能只是来自 AD 的用户 SID 和 也许 用户名)。

批量导出/导入可能可以作为初始部署过程。在应用程序启动并运行并且新用户加入组织后,我预计将需要一种更加用户友好的机制来授予新用户访问我们应用程序的权限(除了将新用户的帐户从 AD 导出/导入到我们的本地数据库)。我的猜测是我们需要某种用户浏览器屏幕,以便我们应用程序中的管理员可以浏览 AD 目录、选择用户、单击按钮然后拥有该用户的“存根”帐户在我们的应用中自动创建。

是否有人实现了具有类似要求的应用程序?如果是这样,您是如何引导在本地数据库中创建“存根”帐户的?有没有更好的方法来满足这些要求?

【问题讨论】:

    标签: asp.net active-directory authorization


    【解决方案1】:

    我目前正在实施类似的解决方案。这是应用程序的工作方式。我正在使用 ASP.NET MVC 5、ASP.NET Identity 2.2.1。

    我正在使用身份框架来管理应用程序中的用户和角色。用户进入登录页面,输入他们的凭据。应用程序检查应用程序数据库以查看用户是否存在。如果不是,则会引发用户在数据库中不存在的错误。如果用户存在,它将针对 AD 进行身份验证。如果身份验证失败,他们会收到一条错误消息,如果没有失败,我会从数据库中的用户(而不是 AD 中的用户)创建一个 ClaimIdentity 并将其传递给我的 SignIn 方法。

    我在应用程序数据库中的用户与 AD 用户名具有相同的用户名,我将其用作我的存根。我还将用户的域包括在数据库中,以防我可能需要支持多个域。使用 Identity,不要忘记使用 guid 填充 SecurityStamp 字段。

    计划是从电子表格中批量导入用户和权限,我创建了一些标准的 CRUD 操作,以允许创建单个用户并在此之后分配角色。

    【讨论】:

    • 我对您建议的设置有疑问。您提到:“我在应用程序数据库中的用户与 AD 用户名具有相同的用户名,我将其用作我的存根”。如果我理解正确,您只需将用户存储在您的 aspnet 身份数据库中并使用 AD 作为身份验证工具。您最初是如何在您的 aspnet 身份数据库中创建这些用户的?要创建用户,您还需要拥有他们的密码,这样您就可以运行以下命令: var result = await UserManager.CreateAsync(user, model.Password);你用什么密码?
    • 我认为您可以在该字段中放置任何内容。由于 AD 用于身份验证,因此您永远不需要使用它。
    【解决方案2】:

    如果对您有帮助,请随意Custom Annotation Authorization

    这只是一种解决方法,或者只是一个想法,而不是解决方案......

    要使用它,你只需要在控制器中使用 Annotation 例如

     [ARQAuthorize]
    public class BlaBlaController : Controller .....
    

    【讨论】:

    • 如果您认为该链接回答了这个问题,请将其标记为重复。不要将其发布为答案
    猜你喜欢
    • 2019-10-04
    • 2013-09-21
    • 1970-01-01
    • 2021-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-30
    • 2020-05-23
    相关资源
    最近更新 更多