会议开始后的ACS



我正在尝试创建一个由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();
}

相关内容

  • 没有找到相关文章

最新更新