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
。将授权码放在那里可以解决我们所有的问题。错误地引用巴德的话,错误不在代码中,而在我们自己。
我们目前在各种网络(主要是网络表单)应用程序中有一个 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
。将授权码放在那里可以解决我们所有的问题。错误地引用巴德的话,错误不在代码中,而在我们自己。