对于普通ASP.NET站点来说,要对该站点的URL进行访问授权控制,可以通过创建一个HttpModule来监控每个Request,如果Request Url为受控URL(即要访问该URL地址需要经过一种特定验证授权)时,则跳转到验证授权页面进行身份验证授权,完成后再返回即可正常访问Request Url。我想,这个实现并不难,网络上也可以找到诸多用HttpHandler和HttpModule来做这块处理的示例。
那么,SharePoint Portal Server 2003中,访问受控URL和普通ASP.NET站点有何不同吗?带着这个疑问,我们可以一开始也用HttpModule来做尝试。假设此时我们访问一个SharePoint 文档库的某个内容,其URL地址应该是 http://localhost/DocLib1/Test.doc,而在我们的受控URL数据库记录中发现 http://localhost/DocLib1 为受控URL,那么要访问 http://localhost/DocLib1/Test.doc,就不能让未经过验证授权的用户直接访问,而应该跳转到我们验证授权页面进行身份验证授权后方能访问。结果很让人遗憾,我们的访问畅通无阻。于是做了调试跟踪,发现在 HttpModule 中 Request.Url 不是我们想要的 http://localhost/DocLib1/Test.doc,而是一个对我们未知的 http://localhost/_vti_bin/owssvr.dll,正因为这个地址不是受控URL,所以HttpModule不做处理直接让用户继续访问了。
姑且不论owssvr.dll到底为何物,现在要解决的关键问题有两个:
对于第一个问题:谁动了我的URL?在了解这个问题答案之前可以先参考以下文章:
看完上面两篇文章,或许你已经清晰知道是谁动了我们的URL。是stsfltr.dll(可以在IIS管理器-->Web站点属性窗口-->ISAPI 筛选器找到)这个ISAPI Filter在HttpModule之前抢先做了处理。
第一个问题找到了,第二个问题:怎么解决这个问题,把执行权抢过来?只能自己再写个 ISAPI Filter,并把该 ISAPI Filter排在stsfltr.dll之前了。于是,我们创建了一个C++ Win32 项目,定义了下面这个一个ISAPI Filter class:
class CRedirectorFilter : public CHttpFilter
{
public:
CRedirectorFilter();
~CRedirectorFilter();
BOOL IsSecureDocument(LPCTSTR docUrl, LPCTSTR agent, LPCTSTR cookie);
BOOL GetCookie(CHttpFilterContext* pCtxt,CString strName, CString & strValue);
BOOL GetAgent(CHttpFilterContext* pCtxt,CString strName, CString & strValue);
// Overrides
// ClassWizard generated virtual function overrides
// NOTE - the ClassWizard will add and remove member functions here.
// DO NOT EDIT what you see in these blocks of generated code !
//{{AFX_VIRTUAL(CRedirectorFilter)
public:
virtual BOOL GetFilterVersion(PHTTP_FILTER_VERSION pVer);
virtual DWORD OnPreprocHeaders(CHttpFilterContext* pCtxt, PHTTP_FILTER_PREPROC_HEADERS pHeaderInfo);
virtual DWORD OnEndOfNetSession(CHttpFilterContext* pCtxt);
//}}AFX_VIRTUAL
//{{AFX_MSG(CRedirectorFilter)
//}}AFX_MSG
};
通过OnPreprocHeaders来处理判断我们的受控 URL 逻辑,如果是受控URL且尚未经过验证,则绕过stsfltr.dll直接跳转到验证授权页面进行身份验证授权;如果不是受控URL或已经经过验证,则直接交给IIS继续处理。
对于MOSS 2007,没有了stsfiltr.dll的困扰,实现类似方案就相对方便许多了,有兴趣者可以利用HttpHandler或HttpModule进行类似实现。
BTW:对于对受控URL的判断逻辑,如果感觉C++实现比较吃力费时,可以考虑用.NET Assembly来写这块逻辑,然后利用C++调用托管DLL来实现这块逻辑。具体可以参考KB:
Other Posts:
>>暂时广告贴:OTEC广州三月份线下聚会
>>ASP.NET AJAX (Atlas) 拖放(Drag & Drop)功能6种实现方法总结
>>JetBrains向MVP免费提供Resharper
>>【非技术】西雅图之行
>>WatiR or WatiN
>>附和一下 demonfox 同学,说说symbian & s60
>>说说
>>$150等于什么?
>>Policy Injection Application Block
>>Gmail的小Bug
>>在MOSS中直接嵌入ASP.NET Page
>>2007 MVP Summit, MS Campus Day
Month Archives:
Top Tags:
Technology Internet Google Company & Product Profiles Search feature column letter analysis Search Headlines comment Startups WebApp咨询 业界信息 业界动态 BigCos Google/SEO 互联网络 国际政治 news 抓虾动态 Search Types: Local 播客指南 application Yahoo 搜索引擎 Gadgets/Hack widget 用户体验 Yahoo: Search Ads SEO
@2007 All rights Reserved |