Обработка одновременных утверждений поставщика удостоверений в WIF

Мое приложение ASP.NET MVC использует WIF 3.5 и Azure ACS для федеративной аутентификации с Google, Facebook и т. д. Во время регистрации, после аутентификации пользователя с помощью IdP, мы сохраняем пользовательские данные в нашей базе данных.

На данный момент он позволяет связать одну учетную запись пользователя с одним поставщиком удостоверений, но у меня есть требование добавить поддержку нескольких поставщиков удостоверений для одной учетной записи (т.е. пользователь может добавить Google, Facebook и т. д. в свою учетную запись, и он может использовать любой из этих IdP для входа на наш сайт). Чтобы добавить дополнительного IdP в свою учетную запись, пользователю необходимо сначала войти в систему основного IdP. Последовательности такие:

  • Пользователь переходит на страницу входа, выбирает одного IdP (например, Google), входит в Google, Azure ACS перенаправляет обратно на наш сайт после аутентификации.
  • На странице профиля пользователь выбирает добавить дополнительного IdP, он перенаправляется на страницу, чтобы выбрать IdP
  • Он нажимает на другого IdP (например, Facebook), входит в Facebook, Azure ACS перенаправляет обратно на наш сайт (я вижу все правильные утверждения от Facebook, которые Azure ACS передал обратно на наш сайт)
  • Проблема в том, что я не знаю, как извлечь эти утверждения Facebook. Если я использую

    HttpContext.Current.User.Identity как Microsoft.IdentityModel.Claims.IClaimsIdentity

Он возвращает утверждения Google (текущий IdP, в который входит пользователь)


person Phuong Nguyen    schedule 26.12.2014    source источник


Ответы (1)


Наконец, мне нужно прочитать ответ и разобрать его на претензии вручную, вот как я это сделал, просто для справки:

//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); 

Хотя это работает, я не уверен, что это лучший способ, поэтому я все же оставляю вопрос открытым для всех, у кого есть лучший ответ.

person Phuong Nguyen    schedule 26.12.2014