ASP.NET權限管理


ASP.NET Web Forms權限管理:

我要將一個文件夾只能讓一個用戶組訪問怎么辦?

可否在網站根目錄下的web.config里這樣設置:

<location path="admin">

    <system.web>

      <authorization>

        <allow roles="adminer">

        </allow>

        <deny users="*">

        </deny>

      </authorization>

    </system.web>

  </location>

(注:最后經過測試,這樣是可以的,這里只是為了說明web.config是分層,可覆蓋的)

最后我想到,在每個文件夾下加一個web.config重寫

<authorization/>部分

如:

a文件夾下web.config:

<?xml version="1.0" encoding="utf-8" ?>

<configuration> 

  <system.web>

      <authorization>

            <allow  roles = "admin"/>

            <deny   user  = "?"/>

    </authorization>

 </system.web>

</configuration>

 

b文件夾下的web.congfig

<?xml version="1.0" encoding="utf-8" ?>

<configuration> 

  <system.web>

      <authorization>

            <allow  roles="teacher"/>

              <deny users = "?" roles = "student,admin"/>

    </authorization>

 </system.web>

</configuration>

這樣就對不同的文件夾實現不同的授權了

 

基於角色的驗證終於完成了

如下實現方法:

1.在web.config里這樣設置:

<system.web>

       <authorization>

              <allow = “roleslist”/>

              <deny users = “?”/>

       </authorization>

</system.webconfig>

 

登陸成功以后生成一個票據,票據里存儲有用戶的用戶名和角色等信息,將票據發送到客戶端,並跳轉到請求的頁面。

如:

//如果通過驗證

if (IsPass)

{

     FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1,studentinfo.userid,DateTime.Now,DateTime.Now.AddMinutes(30),false,studentinfo.role,"/");

     string CodeTicket = FormsAuthentication.Encrypt(ticket);

     HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName,CodeTicket);

     Context.Response.Cookies.Add(cookie);

     Context.Response.Redirect(RedirectTarget);

}

 

2.在Gloabal.asa.cs里的Application_AuthenticateRequest中獲取客戶端的cookie中的role信息,並生成GenericPrincipal對象保存在Application.Conext.User里

如:

protected void Application_AuthenticateRequest(Object sender, EventArgs e)

{

     HttpApplication App = (HttpApplication) sender;

     HttpContext Ctx = App.Context ; //獲取本次Http請求相關的HttpContext對象

     if (Ctx.Request.IsAuthenticated == true) //驗證過的用戶才進行role的處理

     {

         FormsIdentity Id = (FormsIdentity)Ctx.User.Identity ;

         FormsAuthenticationTicket Ticket = Id.Ticket ; //取得身份驗證票

         string[] Roles = Ticket.UserData.Split (',') ; //將身份驗證票中的role數據//轉成字符串數組

         Ctx.User = new GenericPrincipal (Id, Roles) ; //將原有的Identity加上角色信//息新建一個GenericPrincipal表示當前用戶,這樣當前用戶就擁有了role信息

     }

}

使用這種權限管理的前提是Web Forms進行開發,在MVC框架中,這種方法卻無法正常工作,原因有兩點:

  • 請求不再映射到物理目錄。
  • 可能存在多種查找同一控制器的方式。

 

 ASP.NET MVC權限管理:

Authorize特性是ASP.NET MVC自帶的默認授權過濾器,可用來限制用戶對操作方法的訪問。

對於大多數網站來說,基本上整個應用程序都是需要授權的。因此,把AuthorizeAttribute配置為全局過濾器,使用AllowAnonymous特性匿名訪問指定控制器或方法,就變成了不錯的想法。

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new System.Web.Mvc.AuthorizeAttribute());
    filters.Add(new HandleErrorAttribute());
}

這樣就會把AuthorizeAttribute應用到整個程序的所有控制器操作。顯而易見,這樣也限制了對整個網站的訪問。MVC4中新添加了AllowAnonymous特性,用AllowAnonymous特性裝飾的方法能夠匿名訪問。

我們也能限制特定用戶或角色的訪問,Authorize特性允許指定角色和用戶:

[Authorize(Roles = "Administrator,SuperAdmin", Users = "Jon,Phil")]
public class TopSecretController : Controller

值得注意的是全局過濾器只針對MVC控制器操作,不能保障Web Forms、靜態內容或其他ASP.NET處理程序的安全。

 

除了使用過濾器控制權限,我們可以在運行Controller之前來判斷用戶操作權限,那么我們可以試想此處的應用場景,如當我們的用戶未認證,那么我們可以通過直接判斷跳轉到認證頁面。

具體實現方法:重寫Controller里面的OnActionExecuting,需要授權認證的控制器繼承重寫后的Controller。

/// <summary>
/// 在執行操作方法之前由 MVC 框架調用,我們在此實現我們的權限驗證
/// </summary>
/// <param name="filterContext"></param>
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
    int statusCode = 200;//200:成功,401:未登錄,403:沒有權限
    string url = Request.RawUrl.ToLower();
    if (Method.isLogin())
    {
        if (!checkAuthority(url))
        {
            statusCode = 403;
        }
    }
    else
    {
        statusCode = 401;
    }
    if (statusCode != 200)//未通過授權
    {
        if (url.Contains("/api"))//api異步請求返回狀態碼
        {
            var json = new
            {
                result = statusCode
            };
            filterContext.Result = Json(json, JsonRequestBehavior.AllowGet);
        }
        else//頁面請求跳轉
        {
            //filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { Controller = "Login", action = "Login" }));
            switch (statusCode)
            {
                case 401:
                    filterContext.Result = RedirectToAction("Login", "Login");
                    break;
                case 403:
                    filterContext.Result = RedirectToAction("NoAuthority", "Login");
                    break;
            }
        }
    }
}

其中的checkAuthority()方法判斷管理員的權限:

/// <summary>
/// 權限判斷
/// </summary>
/// <param name="power"></param>
private bool checkAuthority(string url)
{
    string[] arr = Method.getAdminInfo["authority"].Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
    string val = "";
    switch (url)
    {
    
//權限100 查看會員 case "/member/mymember": val = "100"; break; //權限101 修改會員 case "/api/editmember": val = "101"; break; } if (val != "")//該頁面需要權限進入 { return arr.Contains(val); } else { return true; }
}
其中的Method.getAdminInfo["authority"]是我寫的獲取登錄票據中管理員的權限(用“,”分割的數字)。

 

RBAC數據庫設計圖:

 


原文參考:.net用戶角色與訪問權限控制

     大型門戶網站的RBAC用戶權限管理

     《ASP.NET MVC4 高級編程》(第四版)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM