我正在尝试创建一个 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
但是,在此事件中,会话为空,并且再也不会调用 session_start。因此,在重定向到身份提供者时,会话似乎被破坏了。
anon -> Application_start
anon -> Session_start
anon -> 导航到 /MyArea
anon -> 重定向到 ACS -> 重定向到 idP
anon -> 登录
auth -> 重定向到 /MyArea
auth -> FederatedAuthentication.WSFederationAuthenticationModule.SignedIn 发生,但会话一片空白!
更新:我仍然没有找到同时存在会话和身份验证的地方。我正在使用 Unity 按需检测用户。如果有一个事件发生时我会喜欢它,但我的工作仍然有效。