SSO 在 ASP.NET 中落后于 HTTP 模块 I 用户的安全性

SSO lags behind the HTTP Module I user for security in ASP.NET

我们目前在各种网络(主要是网络表单)应用程序中有一个 HTTP 模块,用于处理身份验证、页面访问和菜单构建。我们正在尝试引入 SSO,但发现我们无法预测模块(或其事件)的执行顺序。因此,SSO 填充的 Request Header 值(例如用户名)http 通常在我们的安全模块最初执行后填充。

我不想将代码移至母版页。或者,我猜更准确地说,是母版页调用的 class,但我没有看到其他合理的选择。我需要在 SSO 完成它的事情后触发的东西。

我正在寻找使用模块的替代方法。仍然提供通常集中的 passthrough/hub 来控制流量的东西。我唯一能想出的是母版页调用,它不能让我管理 non-aspx 资源,但这可能是我能做的最好的事情了。

如果出于某种原因您无法通过配置让模块按顺序执行,您可以通过代码强制它们按顺序执行。

首先,从配置中删除有问题的模块。

然后,将一个新模块添加到配置中。你将不得不编写这个模块。该模块应按所需顺序调用其他模块。例如:

class MyModuleChain : IHttpModule
{
    private IHttpModule _module1 = new Module1();
    private IHttpModule _module2 = new Module2();

    public void Init(HttpApplication application)
    {  
        application.BeginRequest += new EventHandler(Application_BeginRequest);
        application.EndRequest += new EventHandler(Application_EndRequest);
    }

    public void Application_BeginRequest(object source, EventArgs e)
    {
        //Call the modules in a fixed order
        _module1.Application_BeginRequest(source, e);
        _module2.Application_BeginRequest(source, e);
    }

    public void Application_EndRequest(object source, EventArgs e)
    {
        //Call the modules in a fixed order
        _module1.Application_EndRequest(source, e);
        _module2.Application_EndRequest(source, e);
    }

    public void Dispose()
    {
        _module1.Dispose();
        _module2.Dispose();
    }
}

如果相关模块需要,您可能必须实现更多的事件处理程序。

我试图解决错误的问题。我试图使 current 安全 HTTPModule 与 SSO (Siteminder) 一起工作。问题在于,现有代码是在设计时既是用户身份的验证者,又是基于该身份的资源请求的授权者。并不是说我们要放弃第一个角色,我们必须将我们的授权代码移到适当的事件中——在 SSO 设置请求值之后——PostAcquireRequestState。将授权码放在那里可以解决我们所有的问题。错误地引用巴德的话,错误不在代码中,而在我们自己。