문제

나는 "userData에 정보 작성"섹션을 구현하려고 노력하고 있습니다. 이 기사, 쿠키가 URI의 일부일 때 제대로 작동하지 않습니다.

내 코드 :

// Create the cookie that contains the forms authentication ticket
HttpCookie authCookie = FormsAuthentication.GetAuthCookie( userName, createPersistantCookie );

// Get the FormsAuthenticationTicket out of the encrypted cookie
FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt( authCookie.Value );

// Create a new FormsAuthenticationTicket that includes our custom User Data
FormsAuthenticationTicket newTicket = new FormsAuthenticationTicket( ticket.Version, ticket.Name, ticket.IssueDate, ticket.Expiration, ticket.IsPersistent, "foo");

// Update the authCookie's Value to use the encrypted version of newTicket
authCookie.Value = FormsAuthentication.Encrypt( newTicket );

// Manually add the authCookie to the Cookies collection
HttpContext.Current.Response.Cookies.Add( authCookie );

// Determine redirect URL and send user there
string redirUrl = FormsAuthentication.GetRedirectUrl( userName, createPersistantCookie );

HttpContext.Current.Response.Redirect( redirUrl, false );

Cookieless를 사용하면 페이지가 리디렉션되지만 쿠키 정보가 포함 된 올바른 URI를 얻지 못하므로 request.isauthenticated가 False를 반환하는 내 로그인 페이지로 돌아갑니다. 끝없는 루프가 계속됩니다.

적절한 URI로 어떻게 리디렉션합니까?

도움이 되었습니까?

해결책

나는 이것이 흥미로운 문제라는 것을 알았으므로, 몇 가지 파기, 테스트 및 .NET Framework 소스로 약간의 디버깅을 수행하기 시작했습니다.

기본적으로, 당신이하려는 것은 작동하지 않습니다. 브라우저가 쿠키를 지원하지 않으면 Cookies 컬렉션이 무시됩니다. request.browser.cookies를 확인하여 쿠키가 지원되는지 확인할 수 있습니다.

ASP.NET에서는 세션 상태와 인증 모두 Cookieless 모드를 지원하지만 다른 쿠키에는 확장되지 않습니다. 실제로 세션과 인증은 다른 운영 모드 자체로 설정할 수있는 것으로 보입니다.

인증 시스템은 자체 데이터를 URI에 저장할 수 있지만 URI 자체를 직접 조작하여 그렇게합니다. 안타깝게도 Microsoft는 이러한 기능을 인증 모듈 외부에서 코드로 노출 한 것으로 보입니다.

기본적으로 FormsAuthentication.getAuthCookie () 및 FormsAuthentication.SetAuthCookie ()와 같은 메소드를 사용하면 인증 시스템이 해당 정보를 자동으로 URI에 넣을 수 있지만 사용자 정의 된 제품을 제공 할 수는 없습니다. 이러한 방법에 대한 인증 티켓 ... 따라서 기본 인증 티켓이 고착됩니다.이 경우 사용자 정의 데이터를 저장할 수 있습니다.

그래도...

인증 시스템이 Cookieless가 사라진 경우 인증 티켓에 직접 사용자 정의 데이터를 저장하는 데는 별다른 이점이 없습니다 ... Cookieless 모드에서 "영구 쿠키"와 같은 것은 의미가 없으므로 적어도 한 번은 데이터를 재생할 것입니다. 어쨌든 세션 당.

Cookieless이지만 여전히 사용자 정의 데이터가 필요한 경우에 가장 일반적인 제안은 Cookieless 세션을 활성화하고 사용자 정의 데이터를 세션 변수로 저장하는 것입니다. 세션 ID는 URI에 들어가지만 사용자 정의 데이터는 서버에서 메모리에 유지됩니다. 세션이 chookieless인지 아닌지 여부에 관계없이 사용 패턴은 동일합니다.

정말로 원한다면 URI에 사용자 정의 데이터를 수동으로 저장하는 시스템을 제시 할 수 있습니다. 가장 쉬운 방법은 사용자 정의 데이터를 쿼리 문자열에 넣거나 PathData를 사용하는 것입니다. 서버 메모리를 사용하지 않는 한 (서버에 작은 메모리를 추가하는 것은 저렴하고, 못생긴 URL이며, 수동으로 코드를 작성하여 저렴하지 않습니다).

다른 팁

훌륭한 설명에 감사드립니다, Stephen. 사용자가 쿠키를 허용하지 않는 경우 사용자 데이터를 피하고 데이터베이스에서 데이터를로드해야합니다.

위에 나열된 코드 전에 다음을 수행하겠습니다.

if( !HttpContext.Current.Request.Browser.Cookies || !FormsAuthentication.CookiesSupported )
{
    FormsAuthentication.RedirectFromLoginPage( userName, false);
    return;
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top