SetAuthCookie 기본적 제공된 자명 & 지속성 옵션은 FormsAuthenticationTicket 새를 생성하여 직렬화, FormsAuthentication.Encrypt()의 그것과는에는 Response.Cookies 컬렉션에 설정. SetAuthCookie와 GetAuthCookie는 모두 FormsAuthentication.Encrypt를 간접적으로 호출합니다.
후속 요청에서 FormsAuthentiationModule은 AuthenticateRequest 이벤트를 처리합니다. 쿠키 (만료되었을 수 있음)가 표시되면 machineKey (이 쿠키는 변조되었을 수 있음)의 값을 해독하고 FormsAuthenticationTicket으로 다시 역 직렬화합니다 (손상되었을 수 있음). 그 중 나쁜 것이 발생하지 않으면 티켓에는 사용자 이름, 발급 날짜, 만료 정보 등이 포함됩니다. 티켓이 만료되지 않으면 IIdentity 및 IPrincipal이 만들어져 HttpContext.Current.User 및 Thread에 할당됩니다. CurrentThread.Principal. .NET 4.5 이상에서는 (ClaimsIdentity, ClaimsPrincipal) 클레임 기반입니다. 그 전에는 (GenericPrincipal, FormsIdentity)라고 생각했습니다.
사용자쪽에있는 모든 변조는 익명으로 처리됩니다. 해독에 실패합니다. 이 유효성 검사를 손상시키는 유일한 일은 web.config/machine.config의 machineKey가 어떻게 든 공격자의 손에 닿았거나 프레임 워크 코드에 버그가있는 경우입니다 (Oracle의 Padding 검색에서).
이외에도주의해야 할 다른 사항은 세션 도용입니다. 예를 들어 누군가가 공개 wifi에서 쿠키를 훔쳐 내면 쿠키를 서버에 표시 할 수 있으며 서버는 마치 자신의 것처럼 동작합니다. 이것은 일반적으로 네트워크 트래픽 스니핑을 포함합니다. 이러한 이유로 전체 사이트에 대해 SSL을 사용하고 web.config/system.web/authorization/forms에서 쿠키를 HTTP 전용 및 보안 (https 연결을 통해서만 제공)으로 설정하는 것이 가장 좋습니다. HTTP는 클라이언트 쪽 자바 스크립트에서 사용할 수 없음을 의미합니다. HTTP 전용 및 보안은 효과적으로 HTTPS만을 의미합니다. 이는 전체 사이트에서 SSL을 사용하는 경우에만 작동합니다.
FormsAuthentication은 모바일 웹 브라우저에서 정상적으로 작동합니다. 클라이언트가 쿠키를 허용하기 만하면됩니다. 내가 아는 한, 모든 모바일 장치가 이것을 허용 할 것입니다.
세션 하이 잭킹과 관련하여 내 사이트의 일부가 공개이고 일부 보안이 https (로그인 한 사용자 만 액세스 가능) 인 경우 AuthCookie가 손상됩니다. AuthCookie가 만들어지면 모든 클라이언트 - 서버 호출에서 앞뒤로 이동한다는 것을 알기 때문에 이것을 묻습니다. 특정 페이지에서이를 피할 수있는 방법이 있습니까? 내 계획은 app_start에 인증 단계를 필터로 등록하는 것입니다. [익명] ... 당신의 생각 (멋진 대답을 주셔서 감사합니다!) – DotNet98
system.web/authorization/forms의 경로 옵션을 사용하면 쿠키가 특정 경로에만 표시되도록 할 수 있습니다. 대지. 불행히도 경로는 1 개로 제한됩니다. 따라서 익명 액세스를 허용하려는 사이트 섹션과 인증/권한 부여를 요구하는 섹션이있는 경우 모든 보안 컨텐트를 별도의 경로에두고 해당 경로로 쿠키를 제한 할 수 있습니다.보안 및 http 전용으로 설정하려고합니다. 쿠키 경로는 쿠키가 깨끗한 채널 위로 이동하지 못하도록하는 가장 신뢰할 수있는 방법입니다. – scottt732
예, https가가는 길 같습니다. 나는 사용자 인증없이 https 페이지를 가질 수 있다고 생각한다. 나는 이것이 https의 본성을 고려할 때 성능에 영향을 미친다 고 추정한다. 내 AJAX 호출이 어떻게되는지에 관해 알려줄 수 있습니까? 내 Ajax 호출을 보호하기 위해 특정 작업을 수행해야합니까 (AuthCookie는 내 아약스 호출과 함께 이동합니다) – DotNet98