2011-05-31 55 views
1

我有3種不同類型的用戶(具有不同的角色)在我的web應用程序上進行交互,他們都執行一些任務 - 有些可以完全相同,例如,創建一個報價,其他人可以是該特定用戶唯一的,例如簽署報價。在asp.net中處理不同類型的用戶mvc

爲了更加清晰,有3種類型的用戶:客戶,供應商,客戶。

客戶或客戶可以創建報價,但只有客戶可以簽署報價。

如何確保我的應用程序允許客戶訪問客戶speficic控制器和供應商訪問供應商特定的控制器或區域。通過自定義屬性?我是否將用戶類型存儲在cookie中?這安全嗎?或會話狀態?只要有人登錄到系統,我發回一個LoggedOnDTO對象,我在其上存儲了用戶名,用戶ID和用戶類型......

注意:我離開了asp.net構建用戶的方式,我有我自己的自定義表與我的自定義機制登錄到系統。我有一個註冊的模型Bindiner,看起來爲前綴和我在一個強類型對象的每個動作發送...

示例代碼:

[HttpGet] 
public ActionResult AddComment(int quoteid, ClientUserDTO loggedonclientuser) 
{ 

} 

[HttpGet] 
public ActionResult AddCommentSupplier(int quoteid, Supplier loggedonsuppluser) 
{ 

} 

編輯:此方法由於某種原因似乎很簡單得多...有什麼問題嗎?任何可能的安全問題?線程?

我的會話控制器是:

if (_authService.isValidUser(model)) 
{ 
    var data = _authService.GetAuthenticationCookieDetails(model); 
    AuthenticateCookie.AddDetailsToCookie(data); 
    return Redirect(Url.Action("Index", "Activity")); 
} 

當我創建我的餅乾......我可以簡單的店「ClientUser」,「供應商」或什麼角色他們是餅乾裏。

然後我可以創建一個屬性並讀取cookie數據以查看它們是否是有效的用戶,例如

public class ClientAuthorizationAttribute : AuthorizeAttribute 
    { 
     public bool AlwaysAllowLocalRequests = false; 
     protected override bool AuthorizeCore(System.Web.HttpContextBase httpContext) 
     { 
      if (AlwaysAllowLocalRequests && httpContext.Request.IsLocal) 
      { 
       bool authorized = false; 
       var result = UserDetails.GetTypeFromTicket(httpContext.User.Identity as FormsIdentity); 

       if (result.Equals("client", StringComparison.OrdinalIgnoreCase)) 
       { 
        authorized = true; 
       } 
       //throw no access exception? 
       return authorized; 
      } 
      return base.AuthorizeCore(httpContext); 
     } 
    } 

在我的基礎控制器下注冊屬性,我有一個簡單的工作解決方案?

回答

4

編寫自定義MembershipProvider和自定義RoleProvider那麼你可以使用屬性

<Authorize(Roles:="ROLENAME")> 

你可以學習如何讓你的ASP MVC使用自定義membershiprovider在此question這是裝飾你的CONTROLER類別或具體方法真的很簡單。

編輯: 你這樣做的方式看起來不錯,但我認爲你需要很長的路要走。實現您自己的MembershipProvider和您自己的Roleprovider將花費您不超過20分鐘的時間......並且您將獲得與經過良好測試和記錄的系統一起工作的好處,並且仍然具有使用您自己的數據庫表進行登錄的好處。在一個簡單的登錄系統中,你只需要在roleprovider(GetRolesForUser和IsUserInRole)中寫兩個函數,而在membershipprovider(ValidateUser)中只需要一個函數,你就可以使系統工作。

如果你願意,我可以放置一個位置(也許是pastebin)一個membershipProvider以及我在一個簡單的應用程序中使用的角色提供者(他們是在vb中製作的)。淨,但我相信這不會是一個問題)

+0

+1是的,這是最好的辦法,一旦你看到一些代碼非常容易。 – 2011-05-31 15:23:06

+0

謝謝...我將在週一看看這個,並接受你的答案,然後如果它是好的... – Haroon 2011-06-02 11:23:14

+0

如果您需要關於此主題的一些信息,請告訴我。 – Jonathan 2011-06-03 08:06:13

1

你也可以在基礎控制器中編寫通用代碼,而不是用Authorize屬性裝飾每個動作。請參閱下面的網址。

Good practice to do common authorization in a custom controller factory? 定製控制器工廠/ 5361846#5361846

+0

我喜歡你的代碼,但是我覺得最好使用一個授權屬性...#1它是線程安全的,我從一個類(AuthorizeAttribute)繼承,它只是簡單地工作,如果用戶無效,屬性本身會踢用戶不在系統中... – Haroon 2011-06-10 09:21:22