2009-07-19 1 views
42

로그인 용 인증 쿠키를 설정하기 위해 aspx 및 C#을 사용하고 있습니다.FormsAuthentication.SetAuthCookie를 사용하여 더 많은 정보 저장하기

FormsAuthentication.SetAuthCookie(UserName, True) 

더 많은 정보를 동일한 쿠키에 저장하려고합니다. 이 인증 쿠키에 값을 추가 할 수 있습니까, 아니면 두 번째 http 쿠키를 사용해야합니까?

는 기본적으로 나는 사용자 Id 그래서 난

감사, 사용자 이름과 같은 에덴

답변

47

는 그런 다음 쿠키를 직접 생성의은 FormsAuthenticationTicket에 사용자 데이터를 추가 할 수 있습니다.

the MSDN documentation for FormsAuthenticationTicket에 예제가 있습니다. 티켓을 만들 때, 당신은 일반적으로 당신의 Web.config에 구성된 값과 같아야 할 것이다 시간 제한을 설정하는 데 필요한

편집

참고. 안타깝게도 Framework 3.5 또는 이전 버전에서는 FormsAuthentication 클래스가이 시간 제한을 공개적으로 노출하지 않습니다. 문제를 해결하려면 this connect feedback item에 대한 응답에서 설명한 기술 중 하나를 사용하십시오. 피드백 항목을 연결

UPDATE

슬프게도, 더 이상 존재하지 않는다. 그 기술이 무엇인지 간략하게 설명했으면 좋겠습니다.

예, Microsoft가 과거 연결 항목을 삭제 한 것은 유감입니다. IIRC, 그들이 제시 한 두 가지 기술이 있었다 :

  1. 사용 WebConfigurationManager는 관련 구성 섹션을 읽고 시간 제한 값을 얻을 수 있습니다.

  2. FormsAuthentication.GetAuthCookie을 사용하여 쿠키를 만들고 FormsAuthentication.Decrypt을 사용하여 암호를 해독하고 생성 된 FormsAuthenticationTicket을 검사합니다.

또는 FormsAuthentication.Timeout 속성이있는 .NET 4.x로 업그레이드하십시오.

더 많은 정보를 원하시면 this question를 참조

+0

감사! 이 정확히 내가 뭘 찾고 있었는지! FormsAuthentication.SetAuthCookie의 동작이 겹치는 것처럼 보입니다. 하나의 작은 차이점 만 제외하고 asp.net 3.5 (저는 리플렉터를 사용할 시간이 없습니다)입니다. (이름뿐 아니라) 쿠키에 임의의 데이터를 첨부 할 수 있습니다. 다시 한번 감사드립니다! – Eden

+0

그 의견 보내기 항목은 더 이상 슬프게도 없습니다. 그 기술이 무엇인지 간략하게 설명했으면 좋겠습니다. –

+1

.NET 4.x에서 새 티켓을 만들 때 FormsAuthentication.Timeout을 사용하는 방법은 다음과 같습니다. DateTime.Now.Add (FormsAuthentication.Timeout) –

1

패스 사용자 ID를 키 사용자 테이블 행을 사용하여 데이터베이스에 액세스 할 수 있습니다 저장할 멀리 찾고 있어요 param.

FormsAuthentication.SetAuthCookie(userId, True) 

어떻게 인증 티켓을 보호합니까?

+5

이름의 _instead_를 전달하고 싶지 않습니다. 동일한 인증 쿠키에 더 많은 데이터를 추가하고 싶습니다. 그것은 가능한가? – Eden

+1

@Eden 같은 문제를 해결 했나요? 동일한 티켓을 사용하고 있지만 동일한 티켓에 userId와 역할을 저장하는 가장 좋은 방법은 없습니다. – rogue39nin

15

당신이 원하는대로 인증 쿠키에 넣을 수 있습니다. 즉, 민감한 정보를 넣는 경우 적어도 암호화해야하지만 중요한 정보를 입력하지 않는 것이 좋습니다. 다음과 같이 할 수 있습니다 :

Forms.SetAuthCookie (UserName + "|" + UserId, true); 

그런 다음 사용자 이름이나 사용자 ID가 필요할 때마다 그곳에 있습니다. 쿠키를로드하고 필요한 값을 파싱하면됩니다.

또 다시 나는 특히 이것을 위에 제시 했으므로이 작업을 권장하지 않습니다. 즉, 가능합니다. 당신은 다시 밖으로 데이터를 끌어 접근 방법을 만들어야합니다

public int CurrentUserId 
{ 
    get 
    { 
     int userId = 0; 

     if (HttpContext.Current.Request.IsAuthenticated) 
     { 
      userId = Convert.ToInt32(HttpContext.Current.User.Identity.Name.Split('|')[1]); 
     } 

     return userId; 
    } 
} 

public string CurrentUserName 
{ 
    get 
    { 
     string userName = string.Empty; 

     if (HttpContext.Current.Request.IsAuthenticated) 
     { 
      userName = HttpContext.Current.User.Identity.Name.Split('|')[0]; 
     } 

     return userName; 
    } 
} 
+0

여기서 제시 한 방식은 "편의"방법으로 작동하지만 전체적으로 시스템에 미치는 영향을 줄이려면 Joe가 제시 한 방식을 사용합니다. – andymeadows

3

예는 사용하는 스마트 "|" 자세한 정보를 입력하십시오. Microsoft에 또 다른 오버로드 된 메서드가있는 경우

public static void SetAuthCookie(String userName, bool createPersistentCookie, string userData)` 

그러면 우리의 삶이 훨씬 쉬워지며 코드가 더 안전해질 것입니다.

-1

FormsAuthentication.Timeout.TotalMinutes을 사용하여 web.config의 값을 기준으로 시간 제한을 설정할 수 있습니다.

+0

다시 방문하십시오. 질문 : "기본적으로 사용자 ID를 저장하기 위해 자리를 찾고 있으므로 사용자 테이블 행 키를 사용하여 데이터베이스에 액세스 할 수 있습니다." 이것은 리모컨으로도 대답하지 않습니다. – nathanchere

+0

맞습니다. 가장 앞선 답변에 대한 의견이어야합니다 (http://stackoverflow.com/a/1150271/1758188). 구체적으로 말하자면, 다음을 수행하는 방법입니다. "시간 초과를 설정해야합니다. 일반적으로 web.config에 구성된 값과 같기를 원합니다." –

+0

@nathanchere는 진정 알약 남자를 데려 간다. 그가 제공 한 정보는 전체 솔루션의 중요한 부분이었습니다. 이것은 SO 모델의 약점 중 하나이며, 보조 토론 (정의 : 보충 또는 추가 도움말 및 지원 제공)의 중요성을 인식하지 못하고 있습니다. 이것은 코드 포맷팅 등이없는 빈약 한 코멘트 시스템에만 국한되어서는 안됩니다. –