我正在尝试创建一个ASP.NET MVC站点,该站点具有受Windows Azure ACS保护的特定区域。我希望默认区域不受保护(即允许匿名用户),但只保护子区域。
我通过从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 - &gt;的Application_Start
anon - &gt;在session_start
anon - &gt;导航到/ MyArea
anon - &gt;重定向到ACS - &gt;重定向到idP
anon - &gt;登录
auth - &gt;重定向到/ MyArea
auth - &gt; FederatedAuthentication.WSFederationAuthenticationModule.SignedIn发生,但会话为空!
更新:我还没有找到存在会话和身份验证的地方。我正在使用Unity按需检测用户。我喜欢它,如果有一个事件发生,但我的工作仍然有效。
答案 0 :(得分:3)
根据您想要执行逻辑的时间和方式,您可以选择一些选项(登录后,创建会话令牌后,接收后)。 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事件引发之后设置事件(这是SessionAuthenticationModule和WSFederationAuthenticationModule可用的时候)。我在每个事件处理程序中添加了一个Debugger.Break。将它们留在那里并调试您的应用程序以查看每个事件何时被触发。这将允许您决定何时何地添加逻辑。
答案 1 :(得分:0)
使用您要保护的控制器/操作的[Authorize]属性:
[Authorize]
public ActionResult Index()
{
return View();
}