我正在尝试创建一个由Windows Azure AC保护的特定区域的ASP.NET MVC站点。我希望默认区域不受保护(即允许匿名用户),但只能保护子区域。
我通过从我的web.config中的system.web部分中删除授权元素来实现这一目标。
<authorization>
<deny users="?" />
</authorization>
然后为所需的MVC3区域添加一个受保护的位置。
<location path="MyArea">
<system.web>
<authorization>
<deny users="?" />
</authorization>
</system.web>
</location>
但是,我的旧代码用于访问iClaimsIdentity并将其从我的global.asax的session_start事件中进行处理。现在,该站点不需要身份验证才能访问默认区域,session_start发生在不进行身份验证的情况下。
我可以连接什么事件来处理Wif的身份验证事件?
我已经使用SessionAuthenticationModule_sessionsecurityTokenReceived实现了滑动会话超时,并尝试在OnPostauthenticationRequest事件上添加我的用户分析逻辑,无用。
我能够在首次接线到以下事件后吸引用户:
FederatedAuthentication.ServiceConfigurationCreated
然后,在此事件中,我连接到此事件:
FederatedAuthentication.WSFederationAuthenticationModule.SignedIn
但是,在此事件中,会话为null,session_start再也不会调用。因此,当将会话重定向到身份提供商时,会议似乎被压碎了。
anon-> application_start
anon-> session_start
Anon->导航到/myarea
Anon->重定向到ACS->重定向到IDP
anon->登录
auth->重定向到/myarea
auth-> federatedAuthentication.wsfederationAuthenticationModule.signedIn发生,但会话为null!
更新:我仍然没有找到会话和身份验证的地方。我正在使用Unity按需检测用户。如果有一个事件发生,我会很喜欢它,但是我的工作仍然有效。
您有一些选择,具体取决于何时以及如何执行逻辑(登录后,创建会话令牌时,在接收到它之后)。SessionAuthenticationModule_SessionSecurityTokenReceived
事件应正确工作,但订阅它可能很棘手。这就是您可以做到的:
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
...
FederatedAuthentication.FederationConfigurationCreated += (s, e) =>
{
FederatedAuthentication.SessionAuthenticationModule.SessionSecurityTokenCreated += SessionAuthenticationModule_SessionSecurityTokenCreated;
FederatedAuthentication.SessionAuthenticationModule.SessionSecurityTokenReceived += SessionAuthenticationModule_SessionSecurityTokenReceived;
FederatedAuthentication.WSFederationAuthenticationModule.SessionSecurityTokenCreated += WSFederationAuthenticationModule_SessionSecurityTokenCreated;
FederatedAuthentication.WSFederationAuthenticationModule.SecurityTokenValidated += WSFederationAuthenticationModule_SecurityTokenValidated;
FederatedAuthentication.WSFederationAuthenticationModule.SecurityTokenReceived += WSFederationAuthenticationModule_SecurityTokenReceived;
FederatedAuthentication.WSFederationAuthenticationModule.SignedIn += WSFederationAuthenticationModule_SignedIn;
};
}
void SessionAuthenticationModule_SessionSecurityTokenReceived(object sender, SessionSecurityTokenReceivedEventArgs e)
{
Debugger.Break();
}
void SessionAuthenticationModule_SessionSecurityTokenCreated(object sender, SessionSecurityTokenCreatedEventArgs e)
{
Debugger.Break();
}
void WSFederationAuthenticationModule_SessionSecurityTokenCreated(object sender, SessionSecurityTokenCreatedEventArgs e)
{
Debugger.Break();
}
void WSFederationAuthenticationModule_SecurityTokenValidated(object sender, SecurityTokenValidatedEventArgs e)
{
Debugger.Break();
}
void WSFederationAuthenticationModule_SecurityTokenReceived(object sender, SecurityTokenReceivedEventArgs e)
{
Debugger.Break();
}
void WSFederationAuthenticationModule_SignedIn(object sender, EventArgs e)
{
Debugger.Break();
}
}
所有这些代码都包含在global.asax文件中,并且您想在FederationConfigurationCreated Event Rist Rise(这是sessionAuthenticationModule和wsfederationAuthenticationModule)之后设置事件。我在每个活动处理程序中添加了一个调试器。将它们留在那里并调试您的应用程序,以查看何时触发每个事件。这将使您可以决定何时何地添加逻辑。
在要保护的控制器/操作上使用[授权]属性:
[Authorize]
public ActionResult Index()
{
return View();
}