2014-12-26 8 views
1

ASP.NET MVC 응용 프로그램은 Google, Facebook 등에서 연합 인증에 WIF 3.5 및 Azure ACS를 사용하고 있습니다. 등록하는 동안 IdP로 인증 된 사용자는 Google에 사용자 정의 사용자 데이터를 저장합니다. 데이터 베이스.WIF에서 동시 신원 처리 공급자 클레임 처리

현재로서는 하나의 사용자 계정을 하나의 ID 제공 업체와 연결할 수 있지만 하나의 계정 (여러 명의 사용자가 Google 계정, Facebook 계정 등을 계정에 추가 할 수 있음)에 대한 지원을 추가해야한다는 요구 사항이 있습니다. 그는이 IdP 중 하나를 사용하여 우리 사이트에 로그인 할 수 있습니다.) 계정에 IdP를 추가하려면 먼저 주 IdP에 로그인해야합니다. 서열이 같다 :

  • 사용자는 페이지를 로그인 한 IdP가 (예 : 구글)을 선택 간다 구글에 로그인 푸른 ACS는 프로필 페이지에서 인증
  • 후 다시 사이트로 리디렉션, 사용자에 선택 추가 IdP 추가, IdP 선택 페이지로 리디렉션 됨
  • 다른 IdP (예 : Facebook)를 클릭하고 Facebook에 로그인하면 Azure ACS가 우리 사이트로 리디렉션됩니다. (Azure ACS가 통과 한 Facebook의 모든 올바른 주장을 볼 수 있습니다. 우리의 사이트 등을 맞댄)
  • 문제는 나는이 Facebook 요구를 추출하는 방법 확실하지 않다이다. 내가 사용하는 경우

    HttpContext.Current.User.Identity 그것은 구글을 ​​반환

Microsoft.IdentityModel.Claims.IClaimsIdentity

답변

1

마지막으로 내가 읽을 필요가 주장 (에서 사용자의 로그가 현재 IdP가) 응답은 여기 난 그냥 참조 할 수 있도록 한 방법은 수동으로 주장으로 구문 분석 :

//Response from Azure ACS is stored in wresult parameter 
string samlResponse = Request.Params["wresult"]; 

var xmlTextReader = new XmlTextReader(new StringReader(samlResponse)); 

//Only interested in Assertion section of the response 
xmlTextReader.ReadToFollowing("Assertion", "urn:oasis:names:tc:SAML:2.0:assertion"); 

SecurityTokenHandlerCollection handlers = FederatedAuthentication.ServiceConfiguration.SecurityTokenHandlers; 

// read the token 
var securityToken = handlers.ReadToken(xmlTextReader); 

// validate the token and create the identity collection 
var claimsIdentityCollection = handlers.ValidateToken(securityToken); 

// create ClaimsPrincipal 
var claimsPrincipal = new ClaimsPrincipal(claimsIdentityCollection); 

그것이 내가이 최선의 방법인지 확실하지 않다, 작동하지만, 그래서 아직도 더 나은 대답을 가진 사람이면 누구나 열어 두십시오.