我的Global.asax.cs文件中有2个事件
WSFederationAuthenticationModule_SecurityTokenValidated 和 WSFederationAuthenticationModule_RedirectingToIdentityProvider
wif引擎不会调用WSFederationAuthenticationModule_RedirectingToIdentityProvider。为什么呢?
public class MvcApplication : System.Web.HttpApplication
{
void WSFederationAuthenticationModule_SecurityTokenValidated(object sender, SecurityTokenValidatedEventArgs e)
{
FederatedAuthentication.SessionAuthenticationModule.IsSessionMode = true;
}
void WSFederationAuthenticationModule_RedirectingToIdentityProvider(object sender, RedirectingToIdentityProviderEventArgs e)
{
//some code
}
}
这是web.config中的microsoft.identityModel部分
<microsoft.identityModel>
<service saveBootstrapTokens="true">
<audienceUris mode="Never">
</audienceUris>
<federatedAuthentication>
<wsFederation passiveRedirectEnabled="true" issuer="http://localhost/dss.web.sts.tokenbaker/" realm="http://localhost/dss.web.frontend" requireHttps="false" />
<cookieHandler requireSsl="false" />
</federatedAuthentication>
<issuerNameRegistry type="Microsoft.IdentityModel.Tokens.ConfigurationBasedIssuerNameRegistry, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">
<trustedIssuers>
<add thumbprint="308efdee6453fff68c402e5eceee5b8bb9eaa619" name="servcert" />
</trustedIssuers>
</issuerNameRegistry>
</service>
</microsoft.identityModel>
答案 0 :(得分:7)
您在web.config中缺少以下行:
在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"/>
在system.webServer元素
中 <modules>
<remove name="FormsAuthentication" />
<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>
你的观众Uris是空的。您必须指定Web应用程序,因此它可以使用此功能。所以,添加这一行:
<audienceUris>
<add value="http://localhost/dss.web.frontend"/>
</audienceUris>
如果在此更改后重新考虑问题,则可以实现从WSFederationAuthenticationModule派生的自定义身份验证模块。像这样:
public class CustomAuthenticationModule : WSFederationAuthenticationModule
{
public CustomAuthenticationModule()
{
base.SecurityTokenReceived += CustomAuthenticationModule_SecurityTokenReceived;
}
public void CustomAuthenticationModule_SecurityTokenReceived(object sender, SecurityTokenReceivedEventArgs e)
{
}
protected override void OnAuthenticateRequest(object sender, EventArgs args)
{
base.OnAuthenticateRequest(sender, args);
}
}
然后只是在配置更改而不是WSFederationAuthenticationModule中将CustomAuthenticationModule放入适当的命名空间和程序集签名。所以你可以拦截代表中的电话。
希望这对你有所帮助。
Rastko
答案 1 :(得分:3)
将以下内容添加到Global.asax.cs:
void Application_Start()
{
FederatedAuthentication.ServiceConfigurationCreated += OnServiceConfigurationCreated;
}
void OnServiceConfigurationCreated(object sender, ServiceConfigurationCreatedEventArgs e)
{
FederatedAuthentication.WSFederationAuthenticationModule.RedirectingToIdentityProvider += WSFederationAuthenticationModule_RedirectingToIdentityProvider;
}
答案 2 :(得分:2)
确保您从新名称空间WSFederationAuthenticationModule
引用System.IdentityModel.Services
。
在我的情况下,在将解决方案迁移到.NET 4.5之后,我仍然从旧的Microsoft.IdentityModel.Web
命名空间引用它。
找到我的答案here。
答案 3 :(得分:0)
您是否检查过web.config中元素的passiveRedirectEnabled属性是否设置为true?
答案 4 :(得分:0)
听起来您可能错过了配置中的WSFederationAuthenticationModule
。确保在system.webServer\modules
:
<add name="WSFederationAuthenticationModule" type="Microsoft.IdentityModel.Web.WSFederationAuthenticationModule, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="managedHandler" />
这是system.web\httpModules
:
<add name="WSFederationAuthenticationModule" type="Microsoft.IdentityModel.Web.WSFederationAuthenticationModule, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
阅读here了解详情。
答案 5 :(得分:0)
要检查的一件事是,您在web.config模块和Global.asax.cs using
语句之间引用了一致的程序集。由于类型RedirectingToIdentityProviderEventArgs
同时存在于System.IdentityModel.Services
和Microsoft.IdentityModel.Web
中(从.NET 4.5开始),您可能正在从web.config中的一个程序集添加模块,但引用另一个程序集中的事件arg在Global.asax.cs中汇编。我认为那会失败。
答案 6 :(得分:0)
我的问题是我在system.web / httpModules和system.webServer / modules部分都添加了以下模块。
<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" />
从system.web / httpModules部分删除元素解决了这个问题,并且正在触发附加到WSFederationAuthenticationModule实例的所有事件。
答案 7 :(得分:0)
对于对WSFederationAuthenticationModule
进行子类化并且因此更改web.config
中的模块注册名称并且正在使用自动布线方法(在global.asax.cs
内)的人员,您还将拥有需要更改方法名称的开头。
例如,如果您在system.webServer\modules
<add name="CustomWsFedModule" type="SomeLib.CustomWSFederationAuthenticationModule" preCondition="managedHandler" />
您需要在global.asax.cs
public class MvcApplication : System.Web.HttpApplication
{
void CustomWsFedModule_RedirectingToIdentityProvider(object sender, RedirectingToIdentityProviderEventArgs e)
{
//some code
}
}