【问题标题】:Authentication using active directory in asp.net MVC在 asp.net MVC 中使用活动目录进行身份验证
【发布时间】:2019-07-05 20:54:49
【问题描述】:

我想在我的 asp.net mvc 项目中使用 Active Directory 对用户进行身份验证,经过数小时的互联网冲浪后,我没有发现任何对我有用的东西,我已经看到了所有结果,但什么也没有。

我尝试按照许多帖子的建议编辑我的 web.config。

如果有人可以帮助我提供一些代码或示例,我将不胜感激,因为我不知道从哪里开始。

编辑

我当前的 web.config

<system.web>
<authentication mode="Forms">
  <forms name=".ADAuthCookie" loginUrl="~/MainMenu/Login" timeout="45" 
 slidingExpiration="false" protection="All" />
</authentication>
<authorization>
  <deny users="?" />
</authorization>
<membership defaultProvider="ADMembershipProvider">
  <providers>
    <clear />
     <add name="ADMembershipProvider" 
     type="System.Web.Security.ActiveDirectoryMembershipProvider"  
     connectionStringName="ADConnectionString" 
     attributeMapUsername="sAMAccountName" />
  </providers>
</membership>
</system.web>      
<connectionStrings>
 <add name="ADConnectionString" 
   connectioString="LDAP://myserver.mydomain.COM:389/DC=mydomain,DC=COM" />
</connectionStrings>

狮子座

【问题讨论】:

  • Ciao Leo,看这个Stackoverflow post你只需要设置&lt;authentication mode="Windows" /&gt;
  • @Max 发表的评论应该可以解决您的问题。但是,您是否要针对 Active Directory 验证用户提交的凭据??
  • @GaganDeep 是的,特别是我想向属于特定组的用户显示视图
  • @Max 只加标签?没有更多的代码?比如控制器、视图..?
  • 答案(标签)提供的解决方案无需询问用户的凭据并通过获取当前窗口用户来解决问题。

标签: c# asp.net-mvc active-directory


【解决方案1】:

如果您需要针对 AD 验证用户提交的 איק 用户名和密码,请使用以下代码。

添加对System.DirectoryServices.AccountManagement的引用

在代码文件中

using System.DirectoryServices.AccountManagement;

接下来,在您的 POST 方法中(标志是布尔类型变量)

PrincipalContext pc = new PrincipalContext(ContextType.Domain, "DOMAINNAME");
            flag = pc.ValidateCredentials(UserName, Password);

如果标志为真,则凭据有效,否则无效。

在这种情况下,您需要手动设置用户和角色(通过使用表单身份验证),然后您可以通过使用限制用户/角色显示控制器/视图

[Authorize(Roles="RoleName")]

【讨论】:

  • 这个代码是给控制器的吧?它从我的登录视图接收用户名并通过 Post 传递,这种方法正确吗?
【解决方案2】:

我解决了设置视图模型和控制器的问题,如下所示:

型号

public class LogOnModel
{
    [Required]
    [Display(Name = "User name")]
    public string UserName { get; set; }

    [Required]
    [DataType(DataType.Password)]
    [Display(Name = "Password")]
    public string Password { get; set; }

    [Display(Name = "Remember me?")]
    public bool RememberMe { get; set; }
}

控制器

public class AccountController : Controller
{
    public ActionResult LogOn()
    {
        return View();
    }

    [HttpPost]
    public ActionResult LogOn(LogOnModel model, string returnUrl)
    {
        if (ModelState.IsValid)
        {
            if (Membership.ValidateUser(model.UserName, model.Password))
            {
                FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
                if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/")
                    && !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/"))
                {
                    return Redirect(returnUrl);
                }
                else
                {
                    return RedirectToAction("Main", "MainMenu");
                }
            }
            else
            {
                ModelState.AddModelError("", "The user name or password provided is incorrect");
            }
        }

        // if we got this far, something failed, redisplay form
        return View(model);
    }

    public ActionResult LogOff()
    {
        FormsAuthentication.SignOut();

        return RedirectToAction("Login", "Account");
    }

查看

<body id="bodyMain">
@using (Html.BeginForm("LogOn", null,FormMethod.Post))
{
<div class="container">
    @Html.ValidationSummary(true, "")
    <div style="padding-top:30%"></div>
    <table>
        <tr>
            <td>@Html.EditorFor(model => model.UserName)</td>
            <td>@Html.ValidationMessageFor(model => model.UserName, "",)</td>
        </tr>
        <tr></tr>
        <tr>
            <td>@Html.EditorFor(model => model.Password)</td>
            <td>@Html.ValidationMessageFor(model => model.Password, "")</td>
        </tr>
        <tr>
            <td>@Html.CheckBoxFor(model=>model.RememberMe)</td>               
        </tr>
    </table>
    <br />
    <button type="submit" class="btn btn-info">Login</button>
</div>
}

web.config 和我的问题一样

【讨论】:

    【解决方案3】:

    如 cmets 中所述,只需将身份验证方法从 Forms 更改为 Windows 一样简单:

    <authentication mode="Windows" />
    

    如果您运行它的服务器加入到与您的用户登录到的相同域或受信任的域,那么这将起作用。只要您的站点设置为受信任站点(通常是 Intranet 站点),用户就不会被提示登录。

    要限制应用程序的某些部分,您可以使用AuthorizeAttribute。例如,要限制对 AD 组中的人员的访问:

    [Authorize(Roles="DOMAIN\GroupName")]
    

    或者,限制对特定 AD 用户的访问:

    [Authorize(Users="DOMAIN\UserName")]
    

    可以添加多个角色或用户,用逗号分隔:

    [Authorize(Roles="DOMAIN\Group1, DOMAIN\Group2")]
    

    这些属性可以应用于整个控制器,也可以应用于单个操作。

    更多信息here

    【讨论】:

    • 我有点困惑,但是我需要一种用户必须插入他的用户名并通过的表单,在验证凭据后,用户只能在某些部分导航,例如查看某些东西的详细信息,但不能编辑,例如:示例用户,而管理员可以做任何事情。一种后端,允许指示哪些域用户可以使用特定权限访问。
    • 使用用户必须输入用户名和密码的表单的唯一原因是,如果您的服务器未与用户(或受信任的)加入同一域。你的情况是这样吗?
    • 不,我的电脑加入了服务器的同一个域
    • 然后使用 Windows 身份验证 :) 它会让您的生活轻松很多。它会为您验证他们的凭据,您只需使用 [Authorize] 属性来锁定您需要的控制器或操作。
    • 很好,但经过一番考虑,我得出结论,如果您知道我可以从哪里开始,我还需要使用不在域中的其他用户或电脑登录网站会感激的:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-13
    相关资源
    最近更新 更多