2017-04-04 4 views
0

나는 ASP.Net 응용 프로그램이 있습니다. 요구 사항은 ADFS를 사용하여 폼 인증을 구현하는 것입니다. 사용자가 도메인 (Active Directoris와 동일한 도메인)에서 WebSite에 액세스하는 경우 양식 인증을 수행해야합니다. 즉, 사용자의 Windows 로그인 이메일 ID를 사용하여 사용자가 Active Directory에 있는지 여부를 확인해야합니다. 사용자가 존재하면 웹 사이트는 사용자가 액세스 할 수있게됩니다. 이메일 아이디를 기반으로 사용자를 찾을 수없는 경우 사용자는 자신의 UserName과 Password를 물어보고 사용자를 검색해야하는 두 개의 활성 디렉토리 중 하나를 선택합니다. (PN : 두 개의 활성 디렉토리가 있습니다. 도메인에서 함께 사용하는 경우 하나의 기본값입니다.)양식 인증 및 Windows 인증 사용 Active Directory

사용자가 도메인 외부에서 웹 사이트에 액세스하는 경우 사용자에게 항상 사용자 이름과 비밀번호, 사용자가 속한 두 개의 Active Directory 중 하나를 선택하십시오.

따라서 도메인에서 웹 사이트에 액세스하는 URL 하나와 도메인 외부에서 액세스하는 URL이 있습니다.

그리고이 작업을 수행하는 데 도움이 필요합니다. 프로젝트는 ASP.Net 및 C#의 Framework 3.5를 사용하여 Dot.Net에 있습니다.

코드 솔루션에 대한 도움을 받으실 수 있습니다.

+0

코드를 입력하십시오. –

답변

0

나는 이것을했다. 기본 아이디어는 양식의 기본 인증 양식입니다. 그러나 기본 로그인 페이지는 Windows 인증을 사용합니다. Windows 인증이 성공하면 Forms 티켓을 만들고 계속 진행합니다. 그렇지 않으면 로그인 페이지를 표시합니다.

유일한 경고는 Windows 인증이 항상 브라우저에 401 응답을 보내고 (Windows 자격 증명을 요구하는 경우), 도메인 사용자가 아닌 사용자는 항상 취소 버튼을 클릭해야하는 자격 증명 팝업을 받게된다는 것입니다.

내 프로젝트에서 MVC를 사용했습니다. 내 Windows 로그인 페이지는 /Login/Windows이고 수동 로그인 페이지는 /Login입니다. 여기

내 Web.config의 관련 영역입니다 : 여기
<system.web> 
    <authentication mode="Forms"> 
    <forms loginUrl="~/Login/Windows" defaultUrl="~/" name=".MVCFORMSAUTH" protection="All" timeout="2880" slidingExpiration="true" /> 
    </authentication> 
<system.web> 

<location path="Login"> 
    <system.web> 
    <authorization> 
     <allow users="?" /> 
     <allow users="*" /> 
    </authorization> 
    </system.web> 
</location> 
<location path="Login/Windows"> 
    <system.webServer> 
    <security> 
     <authentication> 
     <windowsAuthentication enabled="true" /> 
     <anonymousAuthentication enabled="false" /> 
     </authentication> 
    </security> 
    <httpErrors errorMode="Detailed" /> 
    </system.webServer> 
    <system.web> 
    <authorization> 
     <allow users="?" /> 
    </authorization> 
    </system.web> 
</location> 

내 인 LoginController입니다 :

[RoutePrefix("Login")] 
public class LoginController : Controller { 

    [Route("")] 
    public ActionResult Login() { 
     //Clear previous credentials 
     if (Request.IsAuthenticated) { 
      FormsAuthentication.SignOut(); 
      Session.RemoveAll(); 
      Session.Clear(); 
      Session.Abandon(); 
     } 
     return View(); 
    } 

    [Route("")] 
    [HttpPost] 
    public ActionResult TryLogin(string username, string password) { 
     //Verify username and password however you need to 

     FormsAuthentication.RedirectFromLoginPage(username, true); 
     return null; 
    } 

    [Route("Windows")] 
    public ActionResult Windows() { 
     var principal = Thread.CurrentPrincipal; 
     if (principal == null || !principal.Identity.IsAuthenticated) { 
      //Windows authentication failed 
      return Redirect(Url.Action("Login", "Login") + "?" + Request.QueryString); 
     } 

     //User is validated, so let's set the authentication cookie 
     FormsAuthentication.RedirectFromLoginPage(principal.Identity.Name, true); 
     return null; 
    } 
} 

로그인보기 그냥 POST를 수행하는 일반 사용자 이름/암호 형태가 될 것입니다 로그인하기.

이 시점에서 사용자는 수동으로 로그인하여 이동할 수있는 /Login 페이지가 있습니다. 사용자가 자동으로 리디렉션되는 기본 로그인 페이지 인 /Login/Windows 페이지도 있습니다. 그러나 Windows 로그인이 실패하면 일반 401 오류 페이지가 표시됩니다.

이처럼 매끄럽게 만드는 열쇠는 로그인보기를 사용자 정의 401 오류 페이지로 사용하는 것입니다. 나는 ViewRenderer class written by Rick Strahl을 사용하여 Application_EndRequest에 응답 내용을 하이재킹하여이를 수행했습니다.

Global.asax.cs :

protected void Application_EndRequest(object sender, EventArgs e) { 
    if (Response.StatusCode != 401 || !Request.Url.ToString().Contains("Login/Windows")) return; 

    //If Windows authentication failed, inject the forms login page as the response content 
    Response.ClearContent(); 
    var r = new ViewRenderer(); 
    Response.Write(r.RenderViewToString("~/Views/Login/Login.cshtml")); 
} 

내가 찾은 또 다른주의 (나는 마지막 시도 이후이 버전 또는 두이었다 있지만)이 IIS Express에서 작동하지 않는다는 것입니다. IIS에서 설정하고 디버거를 가리 키도록했습니다.

+0

고마워요. 내 요구 사항을 이해하는 것이 옳다. 하지만 MVC에 정통한 사람이 아니므로 ASP.Net C#에서 코드를 제게 알려주십시오. 정확히 AD 경로를 정확히 지정해야합니까? Windows 로그인 사용자의 이메일을 사용하여 사용자의 세부 정보를 얻는 방법? 어떻게 이러한 세부 정보를 사용하고 사용자가 웹 사이트에 액세스 할 수 있도록 허용합니까? 토큰이라고 불리는 것이 있다고 생각합니다. – Ajinx

+0

MVC는 ASP.NET의 일부이며 내가 보여 줬던 코드는 이미 C#에 있습니다. Windows 인증이 성공하면 사용자 코드는 내 코드 예제에서 사용되는'Thread.CurrentPrincipal'에서 사용할 수 있습니다. 액세스를 허용하는 양식 인증 토큰은'FormsAuthentication.RedirectFromLoginPage'를 사용하여 작성됩니다. –

0

당신을 위해 효과가있을 수있는 OOTB 해결책이 있습니다.

또한 ADFS WAP을 사용하고 스플릿 브레인 DNS를 설정합니다.

내부 사용자 (도메인 내부)는 ADFS 상자의 DNS를 가져옵니다. 기본값은 Windows auth입니다. (IWA)

외부 사용자 (도메인 외부)는 ADFS WAP 상자의 DNS를 가져옵니다. 기본값은 FBA입니다.