我的 ASP.NET MVC应用程序正在使用WIF 3.5和Azure ACS与Google,Facebook等进行联合身份验证。在注册期间,用户通过 IdP 身份验证后,我们会将自定义用户数据存储在我们的数据库中。
目前,它允许一个用户帐户与一个身份提供商相关联,但我需要为一个帐户添加对多个身份提供商的支持(即用户可以将Google,Facebook等添加到他的帐户中,并且他可以使用这些IdP中的任何一个登录我们的网站)。要向其账户添加其他 IdP,用户需要先登录到主 IdP。序列是这样的:
- 用户进入登录页面,选择一个IdP(例如谷歌),登录谷歌,Azure ACS在身份验证后重定向回我们的网站
- 在个人资料页面中,用户选择添加其他 IdP,他被重定向到页面以选择 IdP
- 他点击另一个IdP(例如Facebook),登录Facebook,Azure ACS重定向回我们的网站(我可以看到Facebook Azure ACS传回我们网站的所有正确声明)
-
问题是我不确定如何提取这些Facebook声明。如果我使用
HttpContext.Current.User.Identity as Microsoft.IdentityModel.Claims.IClaimsIdentity
它返回谷歌(用户登录的当前 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);
虽然它有效,但我不确定这是否是最好的方法,所以我仍然把这个问题留给任何有更好答案的人