2014-05-13 2 views
0

인터넷을 통해 액세스 할 수있는 ASP.NET MVC 5 웹 응용 프로그램 프로젝트를 만들어야합니다. Windows 도메인에 속한 IIS 서버에서 실행되며 일부 URL (도메인 사용자 계정 수락)에 대해 일반 HTTP 인증을 통해 사용자를 이미 인증합니다.ASP.NET MVC 5 IIS 서버의 Windows 도메인을 기반으로 인증

내 프로젝트의 경우 사용자 이름과 비밀번호를 묻는 로그인 페이지를 갖고 싶습니다. 동일한 Windows 도메인에 대해 인증하십시오. 사용자는 로컬 Windows 도메인 사용자로 로그인하지 않습니다. 비슷한 질문에 대한 참조를 찾았지만 Forms 인증 또는 ASP.NET 2.0을 사용했습니다. 새로운 인프라를 사용하여 수행해야하는 방식이 아닌 것 같습니다.

Visual Studio 2013 Web Express를 사용하고 있으며 .NET Framework 4.5 템플릿을 사용하여 새 프로젝트를 만들 때 인증 없음, 개별 사용자 계정, 조직 계정 또는 Windows 인증 중에서 선택할 수 있습니다.

나는 여기서 많은 질문을하기 전에 연구했지만 3 가지 마지막 옵션 중 어느 것이 내가 원하는대로 내 응용 프로그램을 구성 할 수 있는지에 대한 단서를 찾지 못했다.하지만 Windows 인증이 인트라넷 응용 프로그램.
제 연구에서 System.DirectoryServices.dll에 대해 알게되었지만 이것이 인증 논리를 구현하는 방법인지는 확실하지 않습니다.

모든 힌트/링크는 매우 높이 평가 될 것이지만 샘플 코드가 항상 우수합니다.

감사합니다.

+0

안녕 Alexandre, 안녕하세요. 귀하의 질문에 관해서는 귀하의 질문에 대답하기 위해 더 많은 정보가 필요합니다. 사용자가 인터넷을 통해 액세스하지만 사용자의 자격 증명 (로컬 AD 또는 다른 AD)이 어디서 왔는지는 메모하지 않습니다. 또한 사용자가 어떤 종류의 워크 플로를 "로그인"할 것인지, 보안 고려 사항을 고려해야하는지 등을 기억하지 못합니다.하지만 내 AD 추측은 로컬 AD에서 사용자를 인증하는 것입니다. 네트워크 외부에서 연결되면 'Windows 인증'으로 인증을 설정하면됩니다. – Aron

+0

@Aron : 사용자의 자격 증명은 HTTP 인증을 사용하여 인증하는 데 사용되는 동일한 Windows 도메인 컨트롤러 (AD, 추측 컨대)에서 올 것입니다. 사용자는 로그인 페이지에 도달하고 HTTP 인증 대화 상자와 마찬가지로 사용자 이름/비밀번호를 입력하여 인증하지만 면도기 페이지를 사용합니다. 사용자가 로컬 도메인과 동일한 사용자 이름으로 로그인하지 않기 때문에 Windows 인증이 최선의 선택인지는 잘 모릅니다. 사용자/역할이 SQL 데이터베이스에 저장되지 않지만 Windows 도메인 관리를 통해 관리된다는 점을 제외하고는 "개별 사용자 계정"과 동일하게 작동해야합니다. – Alexandre

+0

브라우저 로그인 대신 로그인 양식을 사용하려는 이유가 무엇입니까? 브라우저를 사용하는 것은'Basic '에 대한'Windows Auth'처럼 훨씬 쉬우 며 원하는 것을 말하면'On-Premises Organizational Authentication'이 필요합니다. 이것은 약간 죽이기 (보통 웹 사이트를 호스트 할 때 사용됩니다) . – Aron

답변

0

다음은 PrincipalContext (System.DirectoryServices.AccountManagement)을 사용하여 도메인 자격 증명의 유효성을 검사하는 방법입니다.

public static bool ValidateDomainCredentials(string username, string password) 
{ 

    if (string.IsNullOrEmpty(username) || string.IsNullOrEmpty(password)) 
    { 
     return false; 
    } 

    using (PrincipalContext pc = new PrincipalContext(ContextType.Domain, "mydomain")) 
    { 
      return pc.ValidateCredentials(username, password); 
    } 
} 

로그인하기 전에 전화를 걸어 사용자가 활성 디렉토리에 있는지 확인하십시오.

public async Task<ActionResult> Login(LoginViewModel model, string returnUrl) 
{ 
    ... 
    var user = await UserManager.FindByNameAsync(model.Username); 
    if (user != null && ValidateDomainCredentials(user.user_Name, model.Password)) 
    { 
     await SignInAsync(user, model.RememberMe); 
     return RedirectToLocal(returnUrl); 
    } 
}