我正在尝试使用自定义服务器端登录页面,使用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答案8937123和8926099后,我还添加了以下内容:
<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
将为空,以及我可以做些什么来阻止这种情况发生?
答案 0 :(得分:13)
我自己设法解决了这个问题,因为在SO上有一些与此类似的未解答的问题,我会留下问题并发布我自己的答案。
问题与将MVC应用程序升级到.NET 4.5有关。大多数WIF功能保持不变(至少在表面上),但是所有类都移动到不同的程序集。我按照迁移准则修复了我的问题:http://msdn.microsoft.com/en-us/library/jj157089.aspx
最重要的是删除对Microsoft.IdentityModel
包(v 3.5.0)的旧引用,并确保它们被System.IdentityModel
和System.IdentityModel.Services
dll的类似引用替换,它应该是4.0版本,来自GAC而不是外部包。
我的修复步骤是:
Microsoft.IdentityModel
包并取消引用dll System.IdentityModel.Services.WSFederationAuthenticationModule
<system.webServer><modules>
的{{1}}引用
<system.web><httpModules>
这使得原始的WIF3.5 / MVC3 Code Sample在.NET 4.5下工作