2014-09-04 2 views
0

양식 인증을 사용하는 ASP.NET 웹 사이트를 실행합니다. 사실, 사용자는 아무 것도 입력 할 필요가 없었습니다. - 나는 Request.ServerVariables["LOGON_USER"]을 가져 와서 사용자 정의 클래스 EmployeeInfo을 사용하여 특정 SQL 데이터베이스에서이 사용자 이름을 조회 한 다음 결과에 따라 사용자가 기본 페이지로 리디렉션되었거나 다른 메시지를 표시하는 오류 페이지로 변경되었습니다Windows 인증 사용자 지정 유효성 검사 (데이터베이스에서)

의 Web.config :

<authentication mode="Forms"> 
    <forms loginUrl="Login.aspx"/> 
</authentication> 
<authorization> 
    <deny users="?"/> 
</authorization> 

Login.aspx : 오류의 유형에

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!this.IsPostBack) 
    { 
     FormsAuthentication.SignOut(); 
     string UserName = Request.ServerVariables["LOGON_USER"]; 
     EmployeeInfo CurrentEmployee = EmployeeInfo.RequestDBInfo(UserName); // SQL magic here 
     if (CurrentEmployee = null) 
      Response.Redirect("AccessDenied.aspx?Message=NoInfo"); 
     else 
      if (CurrentEmployee.Suspended = true) 
       Response.Redirect("AccessDenied.aspx?Message=Suspended"); 
       if (CurrentEmployee.Expired = true) 
        Response.Redirect("AccessDenied.aspx?Message=Expired"); 
        if (CurrentEmployee.Position = null) 
         Response.Redirect("AccessDenied.aspx?Message=NoPosition"); 
        else 
         FormsAuthentication.RedirectFromLoginPage(CurrentUserName, true); 
    } 
} 
그것은 최근까지 괜찮 일하는

우리는 자체에 대한 Windows 인증으로 전환했다 근본적인 이유. 이제 잘못된 사용자의 경우 내 웹 사이트는 기본적으로 Login.aspx 페이지를 열어 사용자를 적절한 오류 페이지로 리디렉션합니다. 그러나 사용자는 양식 인증이 수행되지 않고 사용자가 Windows에서 성공적으로 인증되므로 URL을 입력하면 페이지를 열 수 있습니다.

그래서 내 질문은 :

Windows 인증의 상단에 데이터베이스에서 추가 검사를 구현하는 가장 좋은 방법은 무엇입니까? 내가 아는 한 에서 Application_AuthenticateRequest을 변경해야합니까?

답변

0

제공된 정보에서 "통합 Windows 인증"이 활성화 된 것처럼 IIS에서 "익명 허용"이 비활성화 된 것처럼 들립니다. 사이트의 모든 사용자는 웹 브라우저와 서버 (및 기본 네트워크 인프라)간에 인증을 얻습니다. 인증 된 후 IIS는 웹 사이트 리소스 파일의 ACL을 검사하여 (NTFS를 통해) 파일을 요청할 권한이 있는지 확인하고 요청이 ASP.Net 코드에 도달 할 수 있도록 올바르게 설정되었습니다. . 이제 코드에 도달 했으므로 몇 가지 전략부터 시작해 보겠습니다.

Application_AuthenticateRequest가 언급되어 있습니다. 요청자가 구성된 보안 설정 (IIS가 먼저 인증 된 후 web.config에 포함 된 사용자 정의 모듈에 설정된 항목)에 의해 인증 된 후 사용자 정의 보안 코드를 작성하는 주입 지점을 제공하기 때문에 이렇게하는 것이 좋습니다. 또한이 섹션에 보안 코드를 작성할 수 있으며 사이트의 모든 페이지에 대해 보안 코드가 실행됩니다. 이 메서드에 대한 코드를 작성할 때 HttpContext.Current.User이 null이 아니고 HttpContext.Current.User.IsAuthenticatedtrue 인 것을 확인하여 현재 사용자가 인증되었는지 확인할 수 있습니다. `Request.ServerVariables [ "LOGON_USER"] '에서 사용했던 것처럼 User 속성에서 사용자의 네트워크 ID를 얻을 수 있습니다. ID를 받으면 데이터베이스 조회를 수행 한 다음 적절하게 리디렉션 할 수 있습니다.

성능상의 이유로 보안 모델에서 허용되는 경우이 정보를 캐시 할 수 있습니다. 예를 들어, 간단한 방법은 사용 권한이있는 보안 개체를 Session에 저장하는 것입니다. 그런 다음 먼저이를 확인하고 사용자가 아직 인증 된 세션이없는 경우 데이터베이스 조회 등을 수행 할 수 있습니다.

관련 문제