关于web应用程序安全的思考(二)
2008-11-26 13:35:57 来源:WEB开发网现在我们一个一个的接口来做实现
1.认证接口
要对所有的request作出管控,显然只有一种认证方法是远远不够的,就简单如aspx和web service吧,前者可以通过cookie或session来存储用
户ID,而后者就有可能通过soap header或某个参数来调用,甚至以后还会出现其它的user id提取方法。所以对于默认的认证类别我没有使用
hardcode方法,而是采用动态加载动态模组来完成。
//首先我会增加一个认证模组,每个认证模组实现某一类Request的认证方式
Interface IAuthenticateModule
{
//是否匹配本次请求,采用当前这个认证模组
bool IsMatch();
//认证
string Authenticate();
}
//我对认证的实现
class DefaultAuthenticate:IAuthenticate
{
//加载的认证模组
ArrayList _modules = new ArrayList();
static DefaultAuthenticate()
{
读取本系统的配置,利用反射机制动态加载认证模组
}
//认证
string Authenticate()
{
//遍历每个模组,找出第一个匹配的模组进行认证
//所以与配置的顺序有关(如果有2个相同的匹配,可以把专用的模组放在前面)
foreach(IAuthenticateModule module in _modules)
{
if(module.IsMatch())
{
return module.Authenticate();
}
}
}
}
//至于实现则很简单
//如以下为aspx的认证方式
class WebFormAuthenticateModule:IAuthenticateModule
{
bool IsMatch()
{
if(Request.Url请求的是aspx文件)
return true;
return false;
}
string Authenticate()
{
if(Session["userid"]!=null)
return Session["userid"].ToString();
return null;
}
}
//以下为webservice的认证方式
class WebServiceAuthenticateModule:IAuthenticateModule
{
bool IsMatch()
{
if(Request.Url请求的是asmx文件)
return true;
return false;
}
string Authenticate()
{
string userid = 提取soap头的user id栏位
return userid;
}
}
当然您可以在您的安全模组中默认先实现一些认证模组,然后配置时放在后面一些。如果您的新系统有新的认证方式,只要实现一个新的认证模组再配置进去就可以了。
今天就先到这里吧,下篇我会对授权进行实现,希望能给大家一些启发。
更多精彩
赞助商链接