Asp.net mvc 3 会话启动后的ACS

Asp.net mvc 3 会话启动后的ACS,asp.net-mvc-3,azure,wif,acs,Asp.net Mvc 3,Azure,Wif,Acs,我正在尝试创建一个ASP.NET MVC站点,该站点具有受Windows Azure ACS保护的特定区域。我希望默认区域不受保护(即允许匿名用户),但只保护子区域 我通过从web.config中的system.web部分删除authorization元素实现了这一点 <authorization> <deny users="?" /> </authorization> 然后在这个事件中,我连接到这个事件: FederatedAuthenticat

我正在尝试创建一个ASP.NET MVC站点,该站点具有受Windows Azure ACS保护的特定区域。我希望默认区域不受保护(即允许匿名用户),但只保护子区域

我通过从web.config中的system.web部分删除authorization元素实现了这一点

<authorization>
     <deny users="?" />
</authorization>
然后在这个事件中,我连接到这个事件:

FederatedAuthentication.WSFederationAuthenticationModule.SignedIn
但是,在此事件中,会话为null,并且不再调用会话启动。因此,当重定向到身份提供程序时,会话似乎被破坏

anon->应用程序启动
anon->会话\u开始
anon->导航到/MyArea
anon->重定向到ACS->重定向到idP
anon->登录
验证->重定向到/MyArea
auth->FederatedAuthentication.WSFederationAuthenticationModule.SignedIn发生,但会话为空


更新:我仍然没有找到一个同时存在会话和身份验证的地方。我正在使用Unity按需检测用户。如果有一个事件能够按发生的方式进行操作,但我的变通方法仍然有效,我会很高兴。请在要保护的控制器/操作上使用[Authorize]属性:

[Authorize]
public ActionResult Index()
{
    return View();
}

根据您希望何时以及如何执行逻辑(登录后、创建会话令牌时、接收会话令牌后),您有一些选项。
SessionAuthenticationModule\u 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将可用)。我在每个事件处理程序中添加了一个调试器。将它们留在那里,并调试应用程序以查看每个事件何时被触发。这将允许您决定何时何地添加逻辑。

我的FederatedAuthentication类上似乎没有该事件。这仅在.NET4.5中可用吗?
[Authorize]
public ActionResult Index()
{
    return View();
}
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();     
    }
}