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

Using Active Directory for Authentication locally and on Azure

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

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

与 Azure AD 通信的首选途径似乎是 Graph API。但是,图表 API 似乎不受 enterprise/organizational AD 的支持。

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

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

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

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

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 启动程序 class,如下所示:

    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