6

두 가지 방법으로 액세스 할 수있는 웹 응용 프로그램을 구축하고 있습니다. 같은 조직에서 일하는 모든 사람은 액티브 디렉토리를 사용하여 애플리케이션에 액세스 할 수 있습니다.MVC 4 인증 (Active Directory 또는 회원 데이터베이스 사용)

외부의 모든 사용자는 별도의 멤버십 데이터베이스를 통해 애플리케이션에 가입해야합니다. 누구나 자신의 역할을 가진 회원 데이터베이스에 계정을 가져야하므로 광고 연결은 비밀번호와 사용자 이름을 쉽게 기억할 수있게 해주는 보너스입니다. 인터넷을 검색했지만 비슷한 상황을 찾을 수 없습니다. 이것은 광고를 처음 사용하는 것입니다.

누구나 사용할 수있는 프레임 워크에 대해 알고 있거나 문제 해결 방법에 대한 힌트를 제공합니까?

순간에 나는 System.Web.WebData.SimpleMembershipProvider으로 회원 연결을 구현했으며 정상적으로 작동합니다.

나중에 응용 프로그램을 개발할 때 일부 정보를 확인하기 위해 광고에 다른 연결이 필요하지만 이는 다른 날의 문제 일뿐입니다.

도움 주셔서 감사합니다.

답변

5

web.config를 엽니 다. 당신이 당신의 ActiveDirectory에 대한 ConnectionString을해야합니다 모든

먼저 다음 <membership> 태그 아래

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

스크롤합니다.

<membership defaultProvider="SimpleMembershipProvider">

그런 다음 <providers> 내부 AD 회원을위한 새로운 공급자를 추가 : Web.config를 위해 트릭을 할해야

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

당신처럼 <membership> 설정 defaultProvider 특성이 있는지 확인합니다. 이제 로그인 할 때 AD 사용자를 인증해야합니다. AccountController 로그인 작업으로 이동하십시오. 먼저 ActiveDirectory를 통해 사용자를 인증하려고 시도합니다. PrincipalContext이라는 편리한 클래스가 System.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)) 
    { 
     ... 
    } 
} 

희망이 도움이 나는 놓치지 않았다가 실패하면 우리는 기본 멤버 자격 공급자를 사용 아무것도.

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을 추가 할 수 있습니다