7

我正在构建一个可以通过两种方式访问​​的 Web 应用程序。与我在同一组织中工作的每个人都可以使用我们的活动目录来访问该应用程序。

外部的每个人都应通过单独的成员数据库加入应用程序。每个人都应该在会员数据库中拥有一个包含其角色的帐户,因此广告连接只是一个奖励,以便更容易记住密码和用户名。我搜索了互联网,但找不到类似的情况。这是我第一次与广告合作。

有谁知道可以使用的框架或给我一个关于如何尝试解决问题的提示?

目前我实现了会员连接,System.Web.WebData.SimpleMembershipProvider它工作正常。

在应用程序的后期开发中,我还需要一些与广告的其他连接来检查一些信息,但这只是另一天的问题。

谢谢您的帮助。

4

2 回答 2

6

打开你的 web.config。

首先,您的 ActiveDirectory 需要 connectionString:

  <connectionStrings>
    ...
    <add name="ADConnectionString" connectionString=LDAP://*adserver*/DC=*domain* />
    ...
  </connectionStrings>

向下滚动到<membership>标签。确保为 设置了 defaultProvider 属性<membership>,例如:

<membership defaultProvider="SimpleMembershipProvider">

然后在里面为 AD 成员添加新的提供者<providers>

    <add name="ADMembershipProvider" type="System.Web.Security.ActiveDirectoryMembershipProvider" connectionStringName="ADConnectionString" attributeMapUsername="sAMAccountName" />

这应该对 web.config 有用。现在我们需要在登录时对 AD 用户进行身份验证。转到您的 AccountController 登录操作。首先我们尝试通过 ActiveDirectory 对用户进行身份验证PrincipalContextSystem.DirectoryServices.AccountManagement命名空间中有一个方便的类。如果失败,我们使用默认的成员资格提供程序:

        public ActionResult Login(LoginModel model, string returnUrl)
        {
            try
            {
                // try to auth user via AD
                using (PrincipalContext pc = new PrincipalContext(ContextType.Domain))
                {
                    if (pc.ValidateCredentials(model.UserName, model.Password))
                    {
                        FormsAuthentication.SetAuthCookie(model.UserName, false);
                        return RedirectToAction("Index", "Home");
                    }
                }
                // try the default membership auth if active directory fails

                if (Membership.ValidateUser(model.UserName, model.Password))
                {
                    FormsAuthentication.SetAuthCookie(model.UserName, false);

                    if (Url.IsLocalUrl(returnUrl))
                    {
                        return Redirect(returnUrl);
                    }
                    else
                    {
                        return RedirectToAction("Index", "Home");
                    }
                }
                else
                {
                    ModelState.AddModelError("", "Login failed");
                }
            }
            catch
            {
            }
            GetErrorsFromModelState();
            return View(model);
        }

对于您以后的要求,您可以使用 UserPrincipal 类获取当前登录的 ActiveDirectory 用户:

using (var context = new PrincipalContext( ContextType.Domain)) 
{
    using (var aduser = UserPrincipal.FindByIdentity( context,IdentityType.SamAccountName, HttpContext.User.Identity.Name))
    {
        ...
    }
}

希望这会有所帮助,我没有错过任何东西。

于 2013-06-13T10:32:11.620 回答
2

如果具有指定用户名和密码的用户有效,此代码将为您提供

    public bool ValidateUser(string userName, string password)
    {
        bool authenticated = false;
        string dePath = string.Empty;
        dePath += DomainController;
        if (!string.IsNullOrEmpty(BaseDomainName))
        {
            dePath += "/" + BaseDomainName; 
        }
        try
        {
            DirectoryEntry entry = new DirectoryEntry(dePath, userName, password);
            object nativeObject = entry.NativeObject;
            authenticated = true;
        }
        catch
        {
            return false;
        }
        return authenticated;
    }

您可以在 web.config appSettings 中添加 DomainController 和 BaseDomainName 作为键

于 2013-06-13T11:02:57.520 回答