在本地和 Azure 上使用 Active Directory 进行身份验证

Posted

技术标签:

【中文标题】在本地和 Azure 上使用 Active Directory 进行身份验证【英文标题】:Using Active Directory for Authentication locally and on Azure 【发布时间】:2015-02-18 21:24:20 【问题描述】:

我正在开发一个供我公司内部使用的应用程序。我们希望应用程序能够在 Azure 上运行并使用 Windows 帐户进行身份验证。我们正在努力启用 Active Directory 联合服务器 (ADFS),以便将我们的组织 AD 同步到 Azure AD。在此过程中,我正在编写负责确定用户身份的代码。我的主要目标是将管理控制器限制为属于活动目录组的用户。我的印象是 ADFS 应该允许我在 Azure 中查询这个。

我创建了一个服务,它利用 LDAP 来确定当前用户是否在特定组中,并且它在本地工作得很好。但是,通过阅读,我确定 Azure AD 不支持 LDAP。该死!

与 Azure AD 通信的首选路由似乎是Graph API。但是,企业/组织 AD 似乎不支持图形 API。

解决这个问题的第一个想法是利用依赖注入来根据环境切换正在使用的服务,但我认为必须有更好的方法。

我应该使用什么技术来与本地 Active Directory 以及 Azure Active Directory 进行交互?

【问题讨论】:

您应该查看 Azure AD 的组声明和应用程序角色功能。您可以将内部 AD 同步到 Azure AD,在 Azure AD 中设置组/角色,然后将其用作应用程序中的真实来源。见:blogs.technet.com/b/ad/archive/2014/12/18/… 【参考方案1】:

我们在 Azure 实施中遇到了同样的问题,并与 Microsoft 进行了详细讨论。目前没有通用的目录查询方法。我相信微软的计划是最终将 GraphAPI 添加到 AD DS。

如果您使用基于声明的身份验证协议(如 OpenID Connect),另一种选择是让身份提供者使用您的授权逻辑所需的值发出声明。

【讨论】:

【参考方案2】:

ADFS 是身份联合工具,而不是目录同步工具。对于目录同步,您将使用 AADSync - http://www.microsoft.com/en-us/download/details.aspx?id=44225

实现此目的的最简单方法是使用与 ADFS 的联合,并让 ADFS 使用角色信息填充断言。在 ADFS 中设置新的信赖方并添加新的颁发转换规则

Template: Send Group Membership as a claim
Name: Admin claim
Users Group: Choose your domain local group
Outgoing claim type: Role
Value: MyAdminRole

您可以使用 Visual Studio 2012 或更高版本轻松设置联合,或添加 OWIN 启动类,如下所示:

    public void ConfigureAuth(IAppBuilder app)
    
        app.UseCookieAuthentication(new CookieAuthenticationOptions());
        app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
        app.UseWsFederationAuthentication(new WsFederationAuthenticationOptions()
        
            MetadataAddress = "https://adfs.domain.com/federationmetadata/2007-06/federationmetadata.xml",
            Wtrealm = "urn:appid"
            // SignInAsAuthenticationType = // This is picked up automatically from the default set above
        );

        AntiForgeryConfig.UniqueClaimTypeIdentifier = ClaimTypes.NameIdentifier;

    

那么您需要做的就是将 Authorize 属性添加到您的控制器:

[Authorize(Roles = "MyAdminRole")]
public class AdminController : Controller

 ...

为了完整起见,我还要补充一点,一旦 AADSync 配置并运行,您还可以使用 Graph API 在同步到 Azure AD 后获取有关用户的信息。不过,用户和组更新最多可以延迟 3 小时。

HTH

【讨论】:

仅供参考,您目前无法在 Azure AD 中扩展架构,因此如果您的应用依赖于使用 Graph API 的任何自定义属性,并且 AAD 不是一个选项。 @BenV 从 V1.5 开始支持架构扩展:msdn.microsoft.com/en-us/library/azure/dn720459.aspx 这些是特定于应用程序的扩展,基本上允许单个应用程序在目录中存储和读取属性(the announcement blog post 中的目标#1)。不支持从您的本地目录同步的全局架构扩展(上述帖子中的目标 #2)。

以上是关于在本地和 Azure 上使用 Active Directory 进行身份验证的主要内容,如果未能解决你的问题,请参考以下文章

python azure functions v2 msiauthentication

以编程方式在本地 Azure DevOps 服务器工作项注释中为 Active Directory 用户帐户添加 @提及(2021 年 1 月)

使用 Azure Active Directory 时 SonarLint 身份验证不起作用

将本地设备连接到 Azure Active Directory 域服务

Azure Active Directory密码同步问题

Azure Active Directory 中的 URL 重定向