我在我的MVC应用程序中使用WIF和SessionAuthenticationModule进行基于声明的身份验证和授权。 现在几乎一切正常。但是当我在服务器上部署它(安装了Windows Server 2008 R2和.Net 4.5.2)时,它有一种奇怪的行为。它不会创建FedAuth Cookie,并且似乎已将创建的安全令牌添加到url而不是FedAuth cookie。因此,使用wronge url会出现错误的请求错误(HTTP错误400.请求URL无效。)。 我不知道在iis或服务器上是否需要使用System.IdentityModel dll和SessionAuthenticationModule进行任何配置。
这是我的web.config文件的一部分:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
//....
<section name="system.identityModel" type="System.IdentityModel.Configuration.SystemIdentityModelSection, System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
<section name="system.identityModel.services" type="System.IdentityModel.Services.Configuration.SystemIdentityModelServicesSection, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
</configSections>
<system.identityModel>
<identityConfiguration/>
</system.identityModel>
<system.identityModel.services>
<federationConfiguration>
<cookieHandler requireSsl="false" name="PSCID" mode="Chunked" persistentSessionLifetime="30.0:0:0"/>
</federationConfiguration>
</system.identityModel.services>
<system.web>
<authentication mode="Forms">
<forms name="SPSID" loginUrl="~/account/login" timeout="2880" slidingExpiration="true" defaultUrl="~/" domain=""/>
</authentication>
<customErrors mode="On" defaultRedirect="error">
<error statusCode="404" redirect="error/notfound"/>
<error statusCode="403" redirect="error/forbidden"/>
<error statusCode="500" redirect="error/servererror"/>
</customErrors>
<compilation debug="true" targetFramework="4.5.1"/>
<httpRuntime targetFramework="4.5.1"/>
<sessionState cookieName="SID" timeout="2880"/>
<httpModules>
<remove name="FormsAuthenticationModule"/>
<add name="SessionAuthenticationModule" type="System.IdentityModel.Services.SessionAuthenticationModule, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
</httpModules>
</system.web>
<system.webServer>
<validation validateIntegratedModeConfiguration="false"/>
<modules runAllManagedModulesForAllRequests="true">
<remove name="FormsAuthenticationModule"/>
<add name="SessionAuthenticationModule" type="System.IdentityModel.Services.SessionAuthenticationModule, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
</modules>
</system.webServer>
//...
</configuration>
在验证用户名和密码后的登录页面中,我使用这种方法创建FedAuth Cookie:
var token = new SessionSecurityToken(MyCustomClaimsPrincipal.GetInstance(username, roles,claims) );
token.IsPersistent=rememberMe;
var sam = FederatedAuthentication.SessionAuthenticationModule;
sam.IsReferenceMode = true;
sam.WriteSessionTokenToCookie(token);
在服务器上部署并成功登录后,网址如下:
http//w1.mydomain.com/account/8dPbsEZgZ6kV660tL8n8fsqHio.... [a big token here]
我做错了什么?