为什么在MVC Azure ACS联合身份验证中FederatedAuthentication.WSFederationAuthenticationModule为null?

时间:2012-10-17 18:31:19

标签: asp.net-mvc wif .net-4.5 federated-identity

我正在尝试使用自定义服务器端登录页面,使用this教程中的代码和this代码示例,将FederatedAuthentication与.NET 4.5,MVC 4和主动重定向结合在一起

重定向到我的AccountController的LogOn方法工作正常,方法如下:

public ActionResult LogOn()
{
    HrdClient hrdClient = new HrdClient();
    WSFederationAuthenticationModule fam = FederatedAuthentication.WSFederationAuthenticationModule; /*** Fails here because this is null **/
    HrdRequest request = new HrdRequest(fam.Issuer, fam.Realm, context: Request.QueryString["ReturnUrl"]);
    IEnumerable<HrdIdentityProvider> hrdIdentityProviders = hrdClient.GetHrdResponse(request);
    ViewData["Providers"] = hrdIdentityProviders;
    return View();
}

此操作失败,因为FederatedAuthentication.WSFederationAuthenticationModule为空。

使用VS 2012,我运行了新的Identity and Access向导(它似乎取代了旧的STS对话框)。这给了我一个FederationMetadata文件夹,看起来是正确的,并对我的Web.Config进行了一些修改。特别是,模块部分如下所示:

<system.webServer>
<validation validateIntegratedModeConfiguration="false" />
<modules runAllManagedModulesForAllRequests="true">
  <add name="WSFederationAuthenticationModule" type="System.IdentityModel.Services.WSFederationAuthenticationModule, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="managedHandler" />
  <add name="SessionAuthenticationModule" type="System.IdentityModel.Services.SessionAuthenticationModule, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="managedHandler" />
</modules>

看过SO答案89371238926099后,我还添加了以下内容:

 <httpModules>
  <add name="WSFederationAuthenticationModule" type="Microsoft.IdentityModel.Web.WSFederationAuthenticationModule, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
</httpModules>

最后我的nuget packages配置显示了Microsoft.IdentityModel,它被MVC应用程序正确引用:

<packages>
  <package id="Microsoft.IdentityModel" version="6.1.7600.16394" targetFramework="net45" />
</packages>

我还在social.msdn上看过this question,这似乎表明需要运行STS对话框。

任何人都可以解释为什么FederatedAuthentication.WSFederationAuthenticationModule将为空,以及我可以做些什么来阻止这种情况发生?

1 个答案:

答案 0 :(得分:13)

我自己设法解决了这个问题,因为在SO上有一些与此类似的未解答的问题,我会留下问题并发布我自己的答案。

问题与将MVC应用程序升级到.NET 4.5有关。大多数WIF功能保持不变(至少在表面上),但是所有类都移动到不同的程序集。我按照迁移准则修复了我的问题:http://msdn.microsoft.com/en-us/library/jj157089.aspx

最重要的是删除对Microsoft.IdentityModel包(v 3.5.0)的旧引用,并确保它们被System.IdentityModelSystem.IdentityModel.Services dll的类似引用替换,它应该是4.0版本,来自GAC而不是外部包。

我的修复步骤是:

  • 清除我添加到Web.Config的所有垃圾,然后重新启动默认的MVC配置文件。
  • 删除Microsoft.IdentityModel包并取消引用dll
  • 在VS 2012中运行“访问和身份”向导
  • System.IdentityModel.Services.WSFederationAuthenticationModule
  • 中复制<system.webServer><modules>的{​​{1}}引用
  • 添加<system.web><httpModules>
  • 编译,测试,跳舞的小喜悦......

这使得原始的WIF3.5 / MVC3 Code Sample在.NET 4.5下工作