0

我正在将应用程序移植到 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 并将其配置为与我们的本地 AD 同步,这也可以工作。

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

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

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

4

1 回答 1

4

不。

您不能真正将 PrincipalContext 与 WAAD 一起使用。必须在此处明确声明,您目前(2014 年 1 月)不能针对 WAAD 进行直接用户身份验证。您将需要重写应用程序的某些部分以兼容:

  • 身份验证仅发生在 WAAD 端,您的代码无法进行用户+密码验证。这也发生在 WAAD 提供的登录页面上。您对该页面外观的控制有限,并且可以通过WAAD 的高级功能对其进行自定义。
  • 您可以使用WAAD Graph API创建用户重置用户密码
  • 探索 Graph API 以获取您可能需要的其他操作(即询问用户的组成员身份、直接下属等)
  • 您必须从 Windows 身份验证切换到联合身份验证。根据您使用的 VS 版本,这可能容易或困难。对于 VS 2012,有Identity and Access Tool extension。而在 2013 中,只能在创建项目时配置身份验证,之后无法更改。但是您可以从其他项目复制配置更改。您需要更改 web.config 文件以及在 global.asax 中初始化的内容。在这里查看-虽然关于 VS 2013 RC,但 RTM 中的过程是相同的。
于 2014-01-12T16:00:21.330 回答