2015-09-06 21 views
0

我正在嘗試學習ASP MVC的基本安全和訪問限制。關於我的Web應用程序的身份驗證和角色的澄清和同行評審

到目前爲止,我看過/看過的教程,但他們都看起來不同。如果我會搜索一些東西,它會導致我與另一個完全不同的實現。

我實施了Authenticationcustom role provider,我對於事情的工作方式有一些疑問。我從互聯網上找到的大多數解釋似乎過於複雜或過時。

這是我如何實現我的authentication

登錄控制器

[HttpGet] 
    [ActionName("login")] 
    public ActionResult login_load() 
    { 
     return View(); 
    } 

    [HttpPost] 
    [ActionName("login")] 
    public ActionResult login_post(string uname,string pword) 
    { 
     using (EmployeeContext emp = new EmployeeContext()) 
     { 
      int success = emp.login.Where(x => x.username == uname && x.password == pword).Count(); 
      if (success == 1) 
      { 
       FormsAuthentication.SetAuthCookie(uname, false); 

       return RedirectToAction("Details", "Enrollment"); 
      } 
      return View(); 
     } 
    } 

然後我保護我的大多數控制器與[Authorize]

問題#1 什麼的FormsAuthentication.SetAuthCookie(uname, false);的宗旨,我應該typicalfly使用它呢?存放username是否可以。我以後需要它來進行比較嗎?(進一步的安全性?)。它在這裏說Authentication ticket將被賦予用戶名。那些是隨機字母嗎?

-

在那之後,我決定深入瞭解並實施了custom role provider

從roleprovider.cs (我只執行2種方法至今)

public override string[] GetRolesForUser(string username) 
      { 
       if (!HttpContext.Current.User.Identity.IsAuthenticated) 
       { 
        return null; 
       } 

       var cacheKey = username; 
       if (HttpRuntime.Cache[cacheKey] != null) 
       { 
        return (string[])HttpRuntime.Cache[cacheKey]; 
       } 
       string[] roles = new string[] { }; 
       using (MvcApplication6.Models.EmployeeContext emp = new MvcApplication6.Models.EmployeeContext()) 
       { 
        roles = (from a in emp.login 
          join b in emp.roles on a.role equals b.id 
          where a.username.Equals(username) 
          select b.role).ToArray<string>(); 
        if (roles.Count() > 0) 
        { 
         HttpRuntime.Cache.Insert(cacheKey, roles, null, DateTime.Now.AddMinutes(_cacheTimeoutInMinute), Cache.NoSlidingExpiration); 
        } 
       } 
       return roles; 
      } 

問題#2 我有點困惑在這裏,我需要一個深入的說明:那麼基本上的目的是什麼,從我的例子來看,我只是把它等於uname,因爲我不知道發生了什麼。

問題#3 爲什麼返回(string[])HttpRuntime.Cache[cacheKey];如果該值爲空?何時返回以及誰收到了?

問題4 所獲得的價值的角色列表從數據庫之後,該函數將被調用HttpRuntime.Cache.Insert(cacheKey, roles, null, DateTime.Now.AddMinutes(_cacheTimeoutInMinute), Cache.NoSlidingExpiration);。所以從我看到的角色被插入到緩存中?是否用於稍後檢查登錄類型?

問題#5

從該行的代碼:

public override bool IsUserInRole(string uname, string roleName) 
      { 
       var userRoles = GetRolesForUser(uname); 
       return userRoles.Contains(roleName); 
      } 

當他們恰好觸發,誰提供的參數?是從緩存中的roleName

我很難想象引擎蓋下發生了什麼。解釋/推薦將非常有幫助。

+0

我也想補充說,我需要在'Role Providers'之前實現'Authentication'嗎?我覺得在用戶成功登錄後會觸發'RP'。 –

回答

1

FormsAuthentication.SetAuthCookie()的用途是什麼?

這是ASP.NET FormsAuthentication用於處理身份驗證Cookie的內置方法。

基本上,它是爲你做的辛勤工作;爲特定用戶創建一個cookie,將其提供給他們,然後在未來使用它來識別同一用戶。您想使用此功能來登錄用戶(如果他們輸入了正確的憑據)。

string參數用於用戶名。是的,您可以使用username

bool參數適用於您是否希望cookie爲持久。也就是說,即使他們關閉瀏覽器(不管是否使用會話),也要讓他們登錄。

通過以這種方式使用FormsAuthentication,ASP.NET將在訪問後續頁面時再次自動檢測用戶。

基本上cacheKey的目的是什麼?

的httpRuntime緩存組件是管理對象的「盒子」,你可能經常檢索,但不希望擊中數據庫中的所有的時間。

該緩存是作爲一種Key-Value Pair實現的。您示例中的cacheKey是Key-Value集合中的一個關鍵字。你可以把它看作其他語言中使用的其他類似數據結構。

{ 
    "carlobrew": { 
     "roles": { 
      "Name": "Administrator" 
     } 
    } 
} 

所以你基本上是在一個容器中「節約」的用戶carlobrew的角色,讓您可以稍後再得到他們。鍵值對中的鍵用於引用您放入其中的數據。您用來回顧保存的信息的密鑰是uname;即用戶名。

鍵值對中的鍵是唯一的,所以你不能有兩個鍵叫做carlobrew

爲什麼返回(string[])HttpRuntime.Cache[cacheKey];如果值爲空?

有兩個步驟來使用這種典型的「緩存盒」。

  1. 如果我們找到問題的關鍵(如用戶carlobrew),那麼我們可以簡單地返回數據,立竿見影。這不是如果該值爲空。如果值爲非空。這就是爲什麼代碼是if (HttpRuntime.Cache[cacheKey] != null)
  2. 如果密鑰無法找到(也就是,我們沒有爲carlobrew的關鍵),以及那麼我們必須將它添加自己,然後回報它。

由於它是一個緩存,ASP.NET MVC會在計時器到期時自動從緩存中刪除東西。這就是爲什麼你需要檢查數據是否爲空,並重新創建它的原因。

「誰正在接收它」是首先負責調用GetRolesForUser()方法的任何對象。

那麼從我看到的角色被插入到緩存中?

是的。基本上,如果數據不在緩存中,我們需要從數據庫中抓取它並將它放在那裏,所以如果我們很快調用相同的方法,我們可以很容易地找回它。

讓我們來分解它。我們有:

Insert(cacheKey, roles, null, DateTime.Now.AddMinutes(_cacheTimeoutInMinute), Cache.NoSlidingExpiration); 
  • Insert是方法。我們稱之爲。
  • cacheKey是鍵值對的關鍵部分。用戶名。
  • roles是我們想要存儲在緩存中的對象。該對象可以是我們想要的任何東西。
  • DateTime.Now.AddMinutes(_cacheTimeoutInMinute)告訴ASP.NET MVC何時我們希望此數據過期。它可以是我們想要的任何時間量。我不確定變量_cacheTimeoutInMinute可能是5或15分鐘。
  • Cache.NoSlidingExpiration是一個特殊的標誌。我們告訴ASP.NET,當我們訪問這些數據時,不要將過期定時器重置爲完整狀態。例如,如果我們的計時器是15分鐘,並且計時器將在1分鐘後過期,如果我們使用滑動過期並嘗試訪問數據,則計時器將重置爲15分鐘而不會使數據過期。

不確定您的意思是「是否用於稍後檢查登錄類型」。但是,不,在這裏沒有任何登錄類型的檢查。

的isUserInRole

你可能會調用這個當用戶試圖做一些事情。例如,如果用戶轉到/Admin/Index頁面,那麼您可以檢查用戶是否處於角色管理員角色。如果不是,則會返回一個401未經授權的響應,並告訴您用戶不允許他們訪問該頁面。

public Controller Admin 
{ 
    public ActionResult Index() 
    { 
     if (!IsUserInRole("Administrator")) 
     { 
      // redirect "not allowed" 
     } 

     return View(); 
    } 
} 
相關問題