2013-05-07 2 views
0

Thinktecture 코드를 기반으로 한 나만의 아이덴티티 프로 바이더를 구현하고 있습니다. Azure ACS의 이상한 동작은 싱글 사인 아웃 기능을 사용하는 동안입니다. 그것은 google/live와 내 자신의 아이디 공급자에 따라 다릅니다. 로그 아웃에 대한Azure ACS 커스텀 아이덴티티 프로 바이더 Single SignOut

URL (영역은 사이트 이름과 정말 동일) :

mysite.accesscontrol.windows.net/v2/wsfederation?wa=wsignout1.0 & wreply = HTTP % 3A % 2F % 2flocalhost % 2fAdministration.Frontend.Web % 2F = & wtrealm HTTP % 3A % 2F % 2flocalhost % 2fAdministration.Frontend.Web % 2F 여기

로그 아웃하기위한 의사 코드이다 :

//clear FedAuth cookies 
FormsAuthentication.SignOut(); 
FederatedAuthentication.WSFederationAuthenticationModule.SignOut(true); 

//call Single SignOut 
var signoutRequestMessage = new SignOutRequestMessage(new Uri(signOutUrl)); 
return Redirect(signoutRequestMessage.WriteQueryString()); 
,617,

다음은 샘플 플로우입니다 (모든 것을 보려면 개인 브라우징과 피들러를 사용하고 있습니다) :

1) Google 애플리케이션으로 내 애플리케이션에 로그인하고 있습니다.

2) 결과에 나는이 코드 ACS에 페이지를 얻을, 로그 아웃을 클릭합니다

function on_completion() 
    {window.location = 'http://localhost/Administration.Frontend.Web/';} 

<iframe src="https://www.google.com/accounts/Logout" style="visibility: hidden"">/iframe> 
<iframe src="http://localhost/Administration.Frontend.Web/?wa=wsignoutcleanup1.0" style="visibility: hidden"></iframe> 

결과 : 난 내 응용 프로그램과 구글에서 로그 아웃하고 있습니다.

3) 이전 단계에로 ACS에 같은 URL로 리디렉션, 로그 아웃을 클릭, 내 ID 공급자에 로그인하지만 지금은

https://localhost/IdentityProvider/issue/wsfed?wa=wsignout1.0&amp;wreply=https%3a%2f%2fmysite.accesscontrol.windows.net%2fv2%2fwsfederation%3fredirectUrl%3dhttp%3a%2f%2flocalhost%2fAdministration.Frontend.Web%2f 

결과로 리디렉션과 (302) 결과를 얻을 : 전에서 로그 아웃하고있어 내 응용 프로그램 및 제 아이덴티티 공급자.

4) Google을 다시 사용해보십시오. 자격 증명을 입력하여 로그인하십시오. 실패한 경우 로그 아웃하십시오. 응용 프로그램에서 로그 아웃되었지만 Google에서 기록되지 않았습니다. 또한 내가 iframe을 가진 페이지를하지 않는 대신 ACS 다시

(내 응용 프로그램을 다시 mysite.accesscontrol.windows.net에 마지막으로 다음과)

https://localhost/IdentityProvider/issue/wsfed?wa=wsignout1.0 

에 저를 리디렉션하려고 볼

두 가지 주요 질문 :

  1. 왜 ACS 로그 아웃이/라이브하지만, (302) 내 ID 공급자로 리디렉션 구글이있을 수 있습니다에 대한 추가 워싱턴 = wsignoutcleanup1.0 내가 someth 그리워 저에게 iframe이 페이지를 제공 호출 FederationMetadata.xml에 ?
  2. 3 단계 후 ACS처럼 보입니다. 내 신원 공급자 에서 성공적으로 로그 아웃 한 것을 이해하지 못했습니다.이 순간부터 다시 시도해보십시오. 중지하는 방법을 반복해서 알려주십시오.
+0

리디렉션되는 ACS 페이지 (경로, .accesscontrol.windows.net/??? 다음)를 제공 할 수 있습니까? 모호한 역할을하는 페이지 - 먼저 일부 JS + iframe을 렌더링하지만 다음에는 302 응답. – astaykov

+0

또한 ACS 호스트 영역 검색 로그인 페이지 또는 자신의 로그인 페이지를 사용하고 있습니까? ACS가 호스팅하는 것으로 가정합니다. 자체 호스팅 로그인 페이지로 이동 한 후 다시 시도하십시오. – astaykov

+0

여기에 제공된 답변은 http://stackoverflow.com/questions/14932241/logout-from-access-control-service-with-custom-sts/19002310#19002310에서보다 정확한 정보를 제공합니다. –

답변

3

다음은 수행해야 할 작업입니다.

페더레이션 인증으로 작업 할 때 항상 HTTPS를 사용하십시오! 때로는 일반 HTTP이기 때문에 때로는 프로토콜 협상이 실패합니다. 때로는 브라우저가 비보안 트래픽을 차단하므로 로그 아웃 프로세스에 중요합니다. 따라서 항상 HTTPS를 사용하십시오!

이제 싱글 사인 아웃 (single sign out)의 형태를 구현하기 위해 더 많은 일을하고 싶습니다. 로그 아웃에 대한

귀하의 URL :

mysite.accesscontrol.windows.net/v2/wsfederation?wa=wsignout1.0&wreply=http%3a%2f%2flocalhost%2fAdministration.Frontend.Web%2f&wtrealm=http%3a%2f%2flocalhost%2fAdministration.Frontend.Web%2f

이 SignOutRequestMessage를 구성하는 매개 변수로 사용하지 마십시오. 그것을 직접 사용 return Redirect(signOutUrl)!

두 가지 주요 장소에서 로그 아웃을 구현해야합니다.

FormsAuthentication.SignOut(); 
var signoutProtocolLocation = "https://[your_acs_namespace].accesscontrol.windows.net:443/v2/wsfederation?wa=wsignout1.0&wtrealm=[realm]&wreply=[reply]"; 
FederatedAuthentication.WSFederationAuthenticationModule.SignOut(signoutProtocolLocation); 

주 내가 string paramer`에 과부하를 사용 여기 :

첫 번째 장소는 당신이 이미 가지고있는 것과 비슷하지만 중요한 변화 뭔가 (당신이 MVC를 사용하고 주어진) 귀하의 일반적인 로그 오프 동작 방법 결과를 ACS SSO 위치로 리디렉션합니다!

이제 ACS SSO 위치는 JS와 함께 위에서 언급 한 HTML 페이지와 iframe 요소를 생성합니다. 이제 특정 위치 http://localhost/Administration.Frontend.Web/?wa=wsignoutcleanup1.0 당신이 SSO를 구현하는이 코드에서 두 번째 장소입니다

<iframe src="http://localhost/Administration.Frontend.Web/?wa=wsignoutcleanup1.0" style="visibility: hidden"></iframe> 

: 그 중 하나는 무언가 같이 될 것입니다. 이 요청은 이 아니고은 로그인 페이지로 리디렉션해야하지만 올바르게 처리하고 200 또는 301 응답을 반환해야합니다 (차례대로 200을 반환합니다)! 간단히하기 위해 나는 단지 코드가 여기에 사용 붙여 넣습니다 :

if(Request.QueryString.AllKeys.Contains("wa") 
       && Request.QueryString["wa"].Equals("wsignoutcleanup1.0")) 
      { 
       FederatedAuthentication.WSFederationAuthenticationModule.SignOut(true); 
       return RedirectToAction("Index"); 
      } 

wsignoutcleanup 작업에 대한 요청이있는 경우에만 사실으로 SignOut(true) 오버로드를 호출하는 것이 정말 중요합니다. 그리고 사용자의 일반적인 로그 오프를 수행 할 때가 아닙니다.

언급 된 모든 변경을 시도하고 문제가 해결되면 알려주세요.