6

Tôi đang tạo ứng dụng web có thể truy cập theo hai cách. Tất cả những người đang làm việc trong cùng một tổ chức như tôi có thể sử dụng thư mục hoạt động của chúng tôi để truy cập vào ứng dụng.Xác thực MVC 4 với Active Directory hoặc Cơ sở dữ liệu thành viên

Mọi người từ bên ngoài nên tham gia ứng dụng thông qua cơ sở dữ liệu thành viên riêng biệt. Mọi người nên có một tài khoản trong cơ sở dữ liệu thành viên với vai trò của mình, do đó kết nối quảng cáo chỉ là phần thưởng để giúp bạn nhớ mật khẩu và tên người dùng dễ dàng hơn. Tôi đã tìm kiếm trên Internet nhưng không thể tìm thấy một tình huống tương đương. Đây là lần đầu tiên tôi làm việc với quảng cáo.

Có ai biết về một khuôn khổ có thể được sử dụng hoặc cho tôi một gợi ý về cách tôi có thể cố gắng giải quyết vấn đề không?

Hiện tại, tôi đã triển khai kết nối thành viên với System.Web.WebData.SimpleMembershipProvider và hoạt động tốt.

Trong quá trình phát triển ứng dụng sau này, tôi cũng cần một số kết nối khác với quảng cáo để kiểm tra một số thông tin nhưng đó chỉ là vấn đề cho một ngày khác.

Cảm ơn sự giúp đỡ.

Trả lời

5

Mở web.config của bạn.

Trước hết bạn sẽ cần ConnectionString cho ActiveDirectory của bạn:

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

Cuộn xuống thẻ <membership>. Hãy chắc chắn rằng bạn có thuộc tính defaultProvider đặt ra cho <membership>, như:

<membership defaultProvider="SimpleMembershipProvider">

Sau đó thêm nhà cung cấp mới cho các thành viên AD bên <providers>:

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

Điều đó sẽ làm các trick cho web.config. Bây giờ chúng ta cần xác thực người dùng AD khi đăng nhập. Đi đến hành động Login AccountController của bạn. Trước tiên, chúng tôi cố gắng xác thực người dùng qua ActiveDirectory, có lớp tiện dụng được gọi là PrincipalContext trong không gian tên System.DirectoryServices.AccountManagement. Nếu thất bại, chúng tôi sử dụng các nhà cung cấp thành viên mặc định:

 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); 
     } 

Đối với các yêu cầu sau của bạn, bạn có thể nhận được hiện tại người dùng đăng nhập ActiveDirectory với lớp UserPrincipal:

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

Hope this helps và tôi đã không bỏ lỡ bất cứ điều gì.

2

Bộ luật này sẽ cung cấp cho bạn nếu người dùng với tên truy cập và mật khẩu xác định là hợp lệ

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; 
    } 

Bạn có thể thêm DomainController và BaseDomainName trong appSettings web.config như phím

Các vấn đề liên quan