在Azure中使用同步的Active Directory来验证包括组在内的用户?

时间:2014-01-12 14:35:30

标签: asp.net-mvc azure active-directory azure-active-directory

我正在将应用程序移植到azure,在该应用程序中,我们使用Active Directory对用户进行身份验证,如下所示:

var user = model.UserName.Split('\\');
using (PrincipalContext pc = new PrincipalContext(ContextType.Domain, user[0]))
{
    if (pc.ValidateCredentials(user[1], model.Password, ContextOptions.Negotiate))
    {
        using (var adUser = UserPrincipal.FindByIdentity(pc, IdentityType.SamAccountName, user[1]))
        {
            if (!MembershipService.ValidateUser(model.UserName, model.Password))
            {
                using (var userDb = new UsersDbContext())
                {
                    if (userDb.aspnet_Users.Count(u => u.UserName.ToLower().Contains(model.UserName)) <= 0)
                        MembershipService.CreateUser(model.UserName, model.Password, adUser.EmailAddress);
                    else
                    {
                        var msUser = Membership.GetUser(model.UserName);
                        msUser.ChangePassword(msUser.ResetPassword(), model.Password);
                    }
                }
            }
            FormsService.SignIn(model.UserName, model.RememberMe);

            foreach (var role in Roles.GetAllRoles())
            {
                using (var group = GroupPrincipal.FindByIdentity(pc, role))
                {
                    if (group != null)
                    {
                        if (adUser.IsMemberOf(group))
                        {
                            if (!Roles.IsUserInRole(model.UserName, role))
                                Roles.AddUserToRole(model.UserName, role);
                        }
                        else
                        {
                            if (Roles.IsUserInRole(model.UserName, role))
                                Roles.RemoveUserFromRole(model.UserName, role);
                        }
                    }
                }
            }
        }
    }
}

这在我们连接到域服务器的网络服务器上运行正常 现在我设置了一个Windows Azure Active Directory,并将其配置为与我们的On-Premise AD同步,这也适用。

但我现在正在努力寻找一种方法将我的PrincipalContext连接到WAAD。

这甚至可能吗?如果没有,有什么替代方案?

我只找到使用单点登录的示例,它将此重定向到我们不想使用的MS登录页面,因为我们有混合身份验证,并且根据输入的用户名,它使用ASP.NET成员身份或者从AD中提取用户和组(实际上创建了一个ASP.NET成员用户,如上所示)。

1 个答案:

答案 0 :(得分:4)

没有

您无法在PrincipalContext中使用WAAD。必须在此明确声明您目前无法(2014年1月)针对WAAD进行直接用户身份验证。您需要重写应用程序的某些部分才能兼容:

  • 只在WAAD端进行身份验证,您的代码无法进行用户+密码验证。这也发生在WAAD提供的登录页面上。您对此页面的外观控制有限,可以通过Premium features of WAAD自定义。
  • 您可以使用create users。{/ li> reset user passwordWAAD Graph API
  • 探索Graph API以了解您可能需要的其他操作(即询问用户的群组成员资格,直接下属等)。
  • 您必须从Windows身份验证切换到联合身份验证。根据您使用的VS版本,这可能很容易或很难。对于VS 2012,有Identity and Access Tool extension。虽然在2013年,只能在创建项目时配置身份验证,之后无法进行更改。但您可以从其他项目复制配置更改。您需要更改web.config文件以及global.asax中初始化的内容。检查it here - 虽然关于VS 2013 RC,但流程在RTM中是相同的。