在没有WSFederationAuthenticationModule的情况下解析'wresult'值

时间:2012-12-16 16:08:14

标签: c# wif ws-federation azure-acs

从Azure ACS返回时,我在FormCollection中检索联合身份验证结果。包含我需要的信息的值在一个名为" wresult"的加密值内。我在解密此值时遇到问题,无法使用它进行进一步的身份验证。

我不想使用WSFederationAuthenticationModule,因为我没有授权设置Cookie。使用该模块时,它会自动使用Federated-Authenticationtype设置auth-cookies。

我想要检索wresult中包含的声明,然后设置我自己的安全令牌(无论是JWT,SAML 2.0还是其他)。

到目前为止,我找到的唯一可能的解决方法是使用FAModule,然后立即删除会话令牌cookie。但这会导致auth-cookies在响应中被设置两次,并且值立即取消设置。

我最终想要实现的目标如下: 提供对表单站点进行身份验证或使用Azure ACS中的任何身份提供程序进行身份验证的可能性。使用表单身份验证我可以立即比较用户名和密码,并将安全令牌设置为我想要的任何声明。但是在使用Azure ACS时,我想首先将检索的nameidentifier与我的数据库中保存的值进行比较,然后设置我的自定义安全令牌,而不是WS联合。或者,如果nameidentifier未知,我想重定向到表单页面,用户可以使用其凭据验证此nameidentifier。我不希望将azure ACS返回值计算为已通过身份验证。

2 个答案:

答案 0 :(得分:1)

您不必注册FAM - 但您仍然可以使用其辅助方法(例如GetSignInResponseMessage())来解析来自ACS的登录响应消息。

这使您无需使用WIF cookie系统即可访问协议详细信息和返回的安全令牌。

答案 1 :(得分:0)

我建议另外一种设置,而不是修改WSFederatedAuthenticationModule对cookie的默认处理:

  1. 创建并托管您自己的基于表单的身份验证提供程序STS。有一些nice options可以帮助您设置它。
  2. 在ACS中配置新的IP STS
  3. 使用默认ACS登录页面(主域发现页面)或customize your own
  4. 现在,系统会要求您的用户选择要对其进行身份验证的身份提供商。如果他们选择了您的用户名,则在输入用户名/密码后,您的IP将向ACS发送一个名称标识符,然后再将其发送到您的依赖方网站。如果您将Google添加为身份提供商,也会如此。好处是您的RP不需要根据用户登录的IP来表现不同,但如果您想根据IP自定义某些行为,则该信息在ACS发布的令牌中可用。

    此外,如果您想使用JWT令牌而不是SAML,您可以将ACS配置为从ACS门户中的依赖方页面发出它们(尽管这被标记为测试版功能)。