2012-11-19 3 views
-1

사용자를 인증하기 위해 로그인 양식을 사용하고 있습니다.FormsAuthentication과 동일한 세션 인증이 필요합니까?

FormsAuthentication은 클라이언트 쪽 쿠키 또는 URL의 중요한 사용자/역할 멤버쉽을 저장하기 때문에 문제가 없습니다. URL 내에는 거대한 보안 위험이 있으므로 그 부분에 대해서도 알지 않습니다. FormsAuthentication 쿠키를 사용하면 다음과 같은 문제가 발생합니다. a) 클라이언트가 자신의 역할을 지정하는 위치에있는 보안. b) 쿠키에 저장된 데이터의 양이 너무 많습니다. 보안을 통해 아무 것도 얻지 못하고 사용자 데이터 저장소의 크기에 많은 시간을 할애하지 않기 때문에 세션으로 작업하고 싶습니다.

모든 기본 로그인 양식 처리 기능에 대해 FormsAuthentication과 같은 것을 재사용하고 싶습니다. 하지만 오히려 클라이언트 데이터를 저장하는 대신 클라이언트 쪽보다는 세션에 사용자 데이터를 저장하는 것이 좋습니다. 모든 쿠키는 단일 쿠키에 저장됩니다. 차라리 일종의 세션 토큰에 대해 인증하는 것이 좋습니다.

나는 을 가지고 있지 않다. 사용자 데이터의 데이터베이스와 로컬 디스크 저장소는 금지되어있다. 제 3 자 인증 서비스 제공 업체에 의존하고 있습니다. 요구 사항은 이어야합니다.이 서비스로 인한 대화를 줄여야합니다. 따라서 사용자 정보의 임시 저장을위한 세션. 그게 내가 묻는 문제는 아니지. 또한, 요구 사항은 I 등, /이 HttpContext.user 나중에 뷰에서 사용자 정보를 표시하는 AuthorizeAttribute과 같은 것들에 사용 가능성 Thread.CurrentPrincipal을 사용하여 설정해야한다는 것입니다

그래서 FormsAuthentication 저장 모든 사용자 데이터 쿠키에서 클라이언트 측. 반면 세션은 모든 데이터를 서버 측에 저장하고 간단한 클라이언트 측 토큰 쿠키 만 사용합니다. 그러나 Session은 asp.net 시작 및 인증 단계에서 사용할 수 없습니다. 클라이언트 측 대신 세션 서버 측에 모든 데이터를 저장하는 동등한 형식의 "멤버십"공급자가 있습니까?

에는 세션에 해당이없는 경우 ... 내가 설정하는

  1. HttpContext.user Thread.CurrentPrincipal는 방해 또는 기타를 엉망으로하지 않고 모두 MVC 애플리케이션의 나머지 부분에 걸쳐 사용할 수 두 값을 만들려면 MVC 구성 요소?
  2. # 1의 힌팅은 해당 진입 점에서 세션을 사용할 수 있습니까? 그렇지 않다면 Session에 저장된 데이터를 사용하여 Principle/Identity 객체를 만들 수 있도록 어떻게 사용할 수 있습니까?
  3. 이것은 고유 한 요구 사항 일 수 없습니다. 이것을 처리 할 라이브러리가 이미 있습니까?
+0

그래서 AES에 금이 갔습니까? DES조차도 특수 하드웨어를 필요로합니다. 세션에 자격 증명을 저장하면 강력하게 암호화 된 인증 쿠키를 위조하거나 조작하는 어려운 작업에서 세션 쿠키를 위조하거나 하이재킹하는 쉬운 작업으로 ID를 가로 챌 수있는 문제가 줄어 듭니다. 이전 버전의 .NET에서는 int를 추측하여 세션을 가로 챌 수 있었기 때문에 10 억 개 정도의 요청이나 세션 고정을 통해 쉽게 세션 쿠키를 추출하여 제공 할 수있었습니다. int는 int보다 우수합니다.그러나 FormsAuth 티켓을 위조하려면 AES를 작성해야합니다. – MatthewMartin

+0

@MatthewMartin :이 암호화 된 값을 크래킹하는 것이 어려울 지 모르겠지만, 어떤 상황에서도 클라이언트 측의 사용자 이름/역할 아무것도 얻을 수 없으므로 세션에도 참석할 수 있습니다. 또한 쿠키에 대한 스토리지 제한 및 너무 많은 데이터가 전송됩니다. 다시 한번 양식 티켓이 곧 나옵니다. –

+0

그러면 각 요청에 대해 다시 인증을 받아야합니다. – MatthewMartin

답변

1

세션도 정보를 클라이언트 측 쿠키에 저장합니다! (또는 cookieless 경우 URL).

클라이언트를 인증하려면 클라이언트에 로그온 한 후 일종의 자격 증명 (일반적으로 쿠키의 암호화 된 토큰)을 제공해야합니다. 쿠키가 아니라면 무엇을 제안합니까?

FormsAuthentication을 사용해야합니다. 클라이언트 측 쿠키에 저장된 민감한 정보는 웹 서버에만 알려야하는 키를 사용하여 암호화됩니다. "암호화 방법은 공개 지식입니다."라는 말은 적절한 암호화 키에 대한 액세스없이 데이터를 해독 할 수 있다는 의미는 아닙니다.

"역할"및 "타사 인증 공급자"를 언급했습니다. 제 3자가 역할을 제공하는 경우 (예 :"인증 공급자"뿐만 아니라 "인증 공급자"), 공급자에서 얻은 역할을 서버에 캐시하는 것이 타당합니다. 요청이 승인 될 때 ​​세션을 사용할 수 없으므로 캐시 (System.Web.Caching.Cache)를 사용하는 것이 가장 좋습니다.

개인적으로 나는 이것을 custom RoleProvider에 캡슐화합니다. 사용자 정의 RoleProvider는 첫 번째 호출에서 타사의 역할을 가져 와서 캐시에 캐싱하여 GetRolesForUser을 구현합니다. 내가 제안하려고 해요,하지만 다음 작업을 수행 할 수있는 것을 좋아하는 경우에 확실하지

+0

이미 세션은 클라이언트 측 쿠키에 저장된 세션 ID에 의존한다는 것을 이미 알고 있습니다. 그리고, 승인 된 폼 인증은 암호화 된 값을 클라이언트 측에 저장합니다. 여전히 클라이언트 측에 저장됩니다. 따라서, "보안은 얻지 못했지만 저장 용량은 손실되었습니다"에 대한 의견. 나는 이것이 비록 그들이 얼마나 많은 암호화를 사용하든 상관없이 보안 위험을 제시하지만 논쟁의 여지가 있지만 "암호화 강도"라는 주제는이 질문에 정말로 해당되지 않는다. –

+0

@ bob-the-destroyer - "보안을 얻지 못했습니다"라는 것이 잘못되었습니다. 보안 위험이 있다고 말하면 더 안전한 대안을 모릅니다. 결국에는 클라이언트에 토큰을 보내야하고 FormsAuthenticationTicket을 포함하는 쿠키가 .NET에서 가장 많이 사용됩니다. OpenID, OAuth 또는 클라이언트 측 토큰을 사용하는 모든 것. – Joe

+0

또한 인증/승인 단계 (AuthorizeAttribute가 준수하지 않음) 이후에 세션이 채워지지 않았습니까? –

0

:

  • 를 활용하여 응용 프로그램 주 또는 사용자 자격 증명을위한 글로벌 스토리지와 같은 System.Cache.
  • 암호화가 가능한 InMemory 데이터베이스 (예 : RavenDb)를 사용하십시오 (메모리에 있음).

    • 스케일링/잠금 문제 때문에

      내가 생각하는 비교적 흔한/자주 물건을 좋은 장소가 아니다 스토리지 장소로 응용 프로그램 상태를 사용하십니까? < - 그냥 직감.

    • 퍼미션 데이터? 그래서 당신은 웹 사이트의 메모리에있는 사용자를가집니다. 그런 다음 웹 사이트가 충돌하거나 재활용됩니다. 그 데이터는 어떻게됩니까?
    • RavenDb는 정말 멋지다 - go.use.it.now.

나는 로컬 아무것도 저장하지 않는 것을 이해하고, 그래서 사용자가 시스템을 명중 할 때마다, 당신은 정밀 등, 당신의 inmemory 캐시를 새로 고침 할 필요가있다. f'ing 엉덩이에 통증이 있지만 괜찮아요 - 덜 -. (편집 : 데이터가 메모리에 캐시되지 않은 경우 ..)

Anywys, 두 가지 제안.

ProTip :

오! 역할 기반 운동에서 벗어나 Claims based identity 물건을 사용하기 시작하십시오. 예, IPrincipal 및 HttpContext.User 등에서는 여전히 작동합니다. 따라서 이전 코드는 모두 파기되지 않습니다. 하지만 이제 .NET 4.5로 구워졌습니다.

Awesome Video on this for you, me, everyone! 마지막으로

- 보너스 제안

enter image description here

페이스 북/구글/트위터 중 하나와 인증의의 좋은 패키지. 사용자의 신임장을 다른 사이트에 보관하고 있다고 말한 것입니다 (적절한 조치입니다!). 다른 공급자를 사용하는 경우 DNOA 또는 SS를 사용하십시오.

GL!

관련 문제