2013-04-12 1 views
7

MVC 응용 프로그램에서 양식 인증을 사용하여 사용자를 인증 한 다음 System.IdentityModel.Services.SessionAuthenticationModule 세션을 지속합니다.MachineKeySessionSecurityTokenHandler 및 응용 프로그램 재시작 사이에 만료되는 세션 토큰

아직 필요한 시점이 아니기 때문에 응용 프로그램이 Dominick Baier here에 설명 된대로 웹 팜에 잘 살 수 있도록 System.IdentityModel.Services.Tokens.MachineKeySessionSecurityTokenHandler을 활용하고 싶습니다.

내가 가진 문제는 machineKey 기반 처리에서 세션이 서버 시스템에서 시스템으로 유효 할뿐만 아니라 응용 프로그램이 다시 시작될 때까지 지속되어야한다는 것입니다. 그러나 브라우저를 사용하여 응용 프로그램을 다시 시작하거나 다시 작성하면 쿠키가 유효하지 않게되고 인증 화면으로 되돌아옵니다. 다시 인증되면 모든 것이 정상이며 세션이 유지됩니다. 그러나 다음에 앱이 다시 시작되거나 다시 빌드되면 다시 인증해야합니다.

나는 이것이 내가 얻지 못하는 WIF의 한 부분이라고 확신하지만, 여기서부터 어디로 갈 것인가를 모른다. 나는 MachineKeySessionSecurityTokenHandler을 확장해야하는 것을 두려워하지 않지만 계속 진행하기 전에 여기에서 진행되는 것을 이해하고 있는지 확인하고 싶습니다. 나는 SessionSecurityTokenHandler 기본값이 암호화를 위해 응용 프로그램 풀의 일부 식별자와 함께 DPAPI를 사용한다는 것을 이해합니다. 따라서이 경우에 발생하지만, MachineKeySessionSecurityTokenHandler의 동작은 저를 놀리는 것 같습니다. MachineKeySessionSecurityTokenHandler에 의존하여 다시 시작할 때 다시 생성되는 응용 프로그램의 식별자가 있습니까? 방금 설정이 누락 되었습니까? 여기

는 관련 내 Web.config의에서 부분입니다 :

<system.identityModel> 
    <identityConfiguration> 
    <securityTokenHandlers> 
     <remove type="System.IdentityModel.Tokens.SessionSecurityTokenHandler, System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> 
     <add type="System.IdentityModel.Services.Tokens.MachineKeySessionSecurityTokenHandler, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> 
    </securityTokenHandlers> 
    </identityConfiguration> 
</system.identityModel> 

...

<system.web> 
    <machineKey compatibilityMode="Framework45" 
       validationKey="E27893..." 
       decryptionKey="ABC..." 
       validation="SHA1" decryption="AES" /> 
    <authentication mode="Forms"> 
    <forms loginUrl="~/Account/Login" 
     timeout="10080" /> 
    </authentication> 
</system.web> 

...

<configSections> 
    <section name="system.identityModel" 
      type="System.IdentityModel.Configuration.SystemIdentityModelSection, System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" /> 
</configSections> 

<system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"> 
    <add name="SessionAuthenticationModule" 
     type="System.IdentityModel.Services.SessionAuthenticationModule, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> 
    </modules> 
</system.webServer> 
+1

크리스이 이동. 나는 지금 내가하고있는 일을 위해 일하는 것과 같은 것을 얻으려고 고심하고 있었고, 나는 내 web.configs에서 값을 얻고 있었다. web.config 설정을 게시 해 주셔서 감사 드리며,이 문제를 해결하는 데 도움이되었습니다. Mike –

+0

@indiecodemonkey -이게 당신을 도왔다 고 행복합니다! –

+0

폼 인증을 사용하지 않고 사용자를 인증하기 위해 SessionAuthenticationModule을 사용하는 경우 공유 WIF 캐싱 (예 : 앱 풀 재설정에 재설정되지 않음)을 구현하기 위해 마지막으로이 기능이 필요합니다. 그리고 그것은 SessionSecurityTokenCache입니다. MSDN에있는 예제는 https://msdn.microsoft.com/ko-kr/library/hh545457(v=vs.110).aspx –

답변

0

좋아, 이건 내 바보 같은 잘못이야. 여기에 관련없는 이유로, 내가 뭔가 비표준에 FedAuth 쿠키 이름을 설정 (즉 없습니다 "FedAuth"),이 같은 문제는 난 단지 순간에 이런 식으로 설정 하였다

FederatedAuthentication 
    .FederationConfiguration 
    .CookieHandler 
    .Name = "SomeThingNotStandard"; 

로그인 성공시 토큰을 발급 한 것입니다. 물론, 메모리 내 구성이 쿠키 이름으로 "SomeThingNotStandard"를 찾고 있기 때문에 모든 것이 잘 될 것입니다. 하지만 앱을 다시 시작하면 구성이 기본값으로 돌아가며 "SomeThingNotStandard"이 아닌 "FedAuth"을 찾습니다. 이것은 재 로그인을 강요합니다. 성공하면 앱을 다시 구성하고 모든 것이 잘된 것처럼 보입니다.

그래서 위 코드 비트를 Application_Start()에 넣고 다시 빌드하고 다시 시작하면 잘 작동합니다.

벙어리가 내 부분으로 이동합니다.

편집 :

난 그냥 당신에게 감사의 말씀을 드롭하고 싶었 구성

<system.identityModel.services> 
    <federationConfiguration> 
    <cookieHandler 
     name="SomeThingNotStandard" /> 
    </federationConfiguration> 
</system.identityModel.services> 
+0

나는 이것이 어떻게 작동하는지 알 수 없다. WIF는 기본적으로 위에서 지정한 구성으로 재생하기 위해 들어오는 IN-MEMORY 세션 토큰 캐시로 기본 설정됩니다. 리플렉터에서 SessionSecurityTokenCache를 열면 무엇을 의미하는지 알 수 있습니다 [http://code.msdn.microsoft.com/Claims-Aware-Web-Farm-088a7a4f] 캐시가 메모리에있는 경우 앱 재활용시 구슬이 사라집니다. 내가 재활용을 생존을 위해 사용자 정의 SessionSecurityTokenCache를 사용하여 이것을 구현했습니다. – nachonachoman

+1

@pete_w - 내가 제시 한 문제는 특히 쿠키 처리기에 관한 것이지 캐시가 아닙니다. 실제로 기본 토큰 캐시는 메모리에 있으며 앱 재활용은 본질적으로이를 지 웁니다. 당신처럼, 나는 그 문제를 해결하기 위해 내 자신의 커스텀 캐싱 솔루션을 굴리는 것을 끝내었다. 그러나이 문제는 단순히 토큰 쿠키의 사용자 정의 이름을 나쁜 장소에 설정했기 때문에 발생했습니다. 두 가지 문제가 있습니다. –

2

hm - 기계 키를 명시 적으로 설정하는 경우 (내가하는 것처럼) - 작동하지 않는 이유가 표시되지 않습니다. 어쩌면 다른 쿠키, 세션 등을 사용하여 재 인증 문제를 유발할 수 있습니까?

+0

입니다. 문제가 있습니다. Fedudh 쿠키 이름을 사용자 지정 항목으로 설정했기 때문에 이것은 내 부분에서 바보 같았습니다. 나는 아래 답변을 게시 할 것입니다. –