前些時間看到中國微軟做的FrienDev開源項目,發現他們有個思路做使用者權限管理的方法。首先在網站上面建幾個需要許可權才可以訪問的目錄,再建一個就是不需要許可權就可以訪問的目錄,例如:需要許可權的會員管理頁面:Member,公用頁面:Public
然後添加一個空項目StBusiness進來,添加一個類AuthenticationModule,再做一個ApplicationSettings.cs類,用來記錄檔案的路徑與常量,在AuthenticationModule類裡面繼承IHttpModule介面
public class AuthenticationModule : IHttpModule
{
}
在類裡添加初始化方法
public void Init(HttpApplication context)
{
context.AcquireRequestState += new EventHandler(context_AcquireRequestState);
}
添加測試過程
private void context_AcquireRequestState(object sender, EventArgs e)
{
HttpContext context = HttpContext.Current;
string path = context.Request.Path.ToLower();
// 只處理aspx檔案,因為其他檔案無法獲得Session對象,無法判斷是否已經登入
if (path.EndsWith(".aspx"))
{
// 如果使用者沒有登入就會返回false
if (!UserRules.Instance.IsCurrentUserLogined)
{
// 對於公用檔案夾和根目錄的檔案不做判斷
if (path.StartsWith("/" + ApplicationSettings.PUBLICFOLDERNAME + "/")==false && !(path.LastIndexOf("/") == 0))
{
// 跳轉到公用頁面首頁
context.Response.Redirect(ApplicationSettings.PUBLICLOGOUTFILENAME, false);
context.ApplicationInstance.CompleteRequest();
}
}
else //登陸了再查看是587還是普通使用者
{
if (path.ToLower() == ApplicationSettings.MemberAe.ToLower() || path == ApplicationSettings.MemberSe.ToLower())
{
if (context.Session[ApplicationSettings.SESSIONUSERIDKEY].ToString() != "587")
{
// 跳轉到原來頁面
context.Response.Redirect(ApplicationSettings.MemberStm, false);
context.ApplicationInstance.CompleteRequest();
}
}
}
}
}
在代碼上面用到了一個檢查是否登陸的方法UserRules.Instance.IsCurrentUserLogined
添加UserRules類,使用者登陸用單例模式來實現代碼如下:
public class UserRules
{
private static UserRules _instance;
public static UserRules Instance
{
get
{
if (_instance == null)
{
_instance = new UserRules();
}
return _instance;
}
}
private UserRules()
{
}
}
然後再在UserRules類裡面添加IsCurrentUserLogined方法
public bool IsCurrentUserLogined
{
get
{
if (HttpContext.Current.Session["UID"] == null)
{
return false;
}
return true;
}
}
最後一步,就是在web.congif裡面配置
<httpModules>
<add name="AuthenticationModule" type="StBusiness.AuthenticationModule, StBusiness"/>
</httpModules>
這樣就完成的一個最簡單的使用者權限管理功能,發覺對小型簡單的網站來說,這樣不愧是好辦法。