0

在我的MVC5應用程序中,我通過檢查用戶是否存在或不在Active Directory中來應用以下方法。現在,我想用另一種方法這樣的:我送usernamepasswordactive directory如果用戶在它的存在,它應該返回一些active directory信息,即用戶的NameSurnameDepartment。那麼,如何在Controllerweb.config中定義這種認證?在MVC中檢索用戶數據的Active Directory身份驗證

的web.config:

<configuration> 
    <system.web> 
    <httpCookies httpOnlyCookies="true" /> 
    <authentication mode="Forms"> 
     <forms name=".ADAuthCookie" loginUrl="~/Account/Login" timeout="45" slidingExpiration="false" protection="All" /> 
    </authentication> 
    <membership defaultProvider="ADMembershipProvider"> 
     <providers> 
     <clear /> 
     <add name="ADMembershipProvider" type="System.Web.Security.ActiveDirectoryMembershipProvider" connectionStringName="ADConnectionString" attributeMapUsername="sAMAccountName" connectionUsername="[email protected]" connectionPassword="MyPassword" /> 
     </providers> 
    </membership> 
    </system.web> 
    <connectionStrings> 
    <!-- for LDAP --> 
    <add name="ADConnectionString" connectionString="LDAP://adadfaf.my.company:111/DC=my,DC=company" /> 
    </connectionStrings> 
</configuration> 


控制器:

[AllowAnonymous] 
[ValidateAntiForgeryToken] 
[HttpPost] 
public ActionResult Login(User model, string returnUrl) 
{ 
    if (!this.ModelState.IsValid) 
    { 
     return this.View(model); 
    }  

    //At here I need to retrieve some user data from Active Directory instead of hust a boolean result 
    if (Membership.ValidateUser(model.UserName, model.Password)) 
    { 
     //On the other hand I am not sure if this cookie lines are enough or not. Should I add some additional lines? 
     FormsAuthentication.SetAuthCookie(model.UserName, false); 
     if (this.Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/") 
      && !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\")) 
     { 
      return this.Redirect(returnUrl); 
     } 
     return this.RedirectToAction("Index", "Issue"); 
    } 

    TempData["message"] = "The user name or password provided is incorrect."; 
    return this.View(model); 
} 

回答

0

我所做的是創建一個類 「會話用戶」,其控股的用戶名,其中,LoginName並能夠驗證用戶憑證。

在這個類,你也得把/調用方法/屬性獲得部,姓和更多...

public class SesssionUser 
{ 
    [Key] 
    [Required] 
    public int UserId { get; set; } 
    [Required] 
    public string LoginName { get; set; } 
    [Required] 
    [DataType(DataType.Password)] 
    public string Password { get; set; } 


    private Boolean IsAuth{ get; set; } 
    public string Department 
    { 
     get { 
     return GetDepartment(); 
     } 
    } 

    private string GetDepartment() 
    { 
     if(!IsAuth) { return null; } 
     //Gets the department. 
    } 

    private bool Authenticate(string userName,string password, string domain) 
    { 
     bool authentic = false; 
     try 
     { 
      DirectoryEntry entry = new DirectoryEntry("LDAP://" + domain, 
      userName, password); 
      object nativeObject = entry.NativeObject; 
      authentic = true; 
     } 
      catch (DirectoryServicesCOMException) { } 
      return authentic; 
    } 

    /// <summary> 
    /// Validates the user in the AD 
    /// </summary> 
    /// <returns>true if the credentials are correct else false</returns> 
    public Boolean ValidateUser() 
    { 
     IsAuth = Authenticate(LoginName,Password,"<YourDomain>"); 
     return IsAuth; 
    } 
} 

下一步是創建一個控制器,在我的情況「的AccountController」其中包含用戶的登錄和註銷。它使用FormsAuthentication來設置身份驗證。餅乾。

using System; 
using System.Globalization; 
using System.Linq; 
using System.Security.Claims; 
using System.Threading.Tasks; 
using System.Web; 
using System.Web.Mvc; 
using Microsoft.AspNet.Identity; 
using Microsoft.AspNet.Identity.Owin; 
using Microsoft.Owin.Security; 
using System.Web.Security; 

using MVCErrorLog.Models; 

//My class 
using Admin.ActiveDirectoryHelper.Objects; 

using MVCErrorLog.ViewModels; 

namespace MVCErrorLog.Controllers 
{ 

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

     [HttpPost] 
     [ValidateAntiForgeryToken] 
     public ActionResult Login(string username, string pw) 
     { 
      if (!ModelState.IsValid) { return RedirectToAction("Index", "Home"); } 

      var sessionUser = new SesssionUser(); 
      sessionUser.LoginName = username; 
      sessionUser.Password = pw; 
      sessionUser.UserId = 1; 

      if (!sessionUser.ValidateUser()) { return View("Login"); } 
      FormsAuthentication.SetAuthCookie(sessionUser.LoginName, true); 
      return RedirectToAction("Index", "ErrorLogs"); 
     } 

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

      return RedirectToAction("Index", "ErrorLogs"); 
     } 


     private SesssionUser SetupFormsAuthTicket(SesssionUser user, bool persistanceFlag) 
     { 
      var userData = user.UserId.ToString(CultureInfo.InvariantCulture); 
      var authTicket = new FormsAuthenticationTicket(1, //version 
           user.LoginName, // user name 
           DateTime.Now,    //creation 
           DateTime.Now.AddMinutes(30), //Expiration 
           persistanceFlag, //Persistent 
           userData); 

      var encTicket = FormsAuthentication.Encrypt(authTicket); 
      Response.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName, encTicket)); 
      return user; 
     } 


     protected override void Dispose(bool disposing) 
     { 
      if (disposing) 
      { 

      } 

      base.Dispose(disposing); 
     } 
    } 
} 

最後一步是配置conf。文件以使用身份驗證。模式窗體

<authentication mode="Forms"> 
    <forms loginUrl="~/Account/Login" timeout="1440" /> <!--1440min = 24hours--> 
</authentication> 

現在,你只需要調用登錄在視圖中,傳遞的參數,你是好。

+0

非常感謝您的回覆。我嘗試應用此方法,但遇到了一些問題,即SesssionUser類中的「名稱'SearchPattern'在當前上下文中不存在」。另一方面,CurrUser = false;行不應該工作。我們應該分配空而不是假嗎?因爲用戶不是布爾類型,並且它是一個域類。 –

+0

這是我爲我的公司創建的一個類也是User類。 Iam不允許將它寫入堆棧。在'ValidateUser()'方法中,您必須爲用戶提供針對AD的自己的驗證。你可以看看[codeproject](http://www.codeproject.com/Articles/18102/Howto-Almost-Everything-In-Active-Directory-via-C) – C0d1ngJammer

+0

我改變了代碼。正如我所說,你必須創建自己的AD-Class才能獲得公司,姓...... – C0d1ngJammer

相關問題