会话开始后的ACS

时间:2012-12-18 19:15:21

标签: asp.net-mvc-3 azure wif acs

我正在尝试创建一个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按需检测用户。我喜欢它,如果有一个事件发生,但我的工作仍然有效。

2 个答案:

答案 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();
}