2

我正在創建一個ASP.Net MVC 5應用程序。在我的網站中,存在3種不同類型的用戶。具有不同功能的用戶

  • 聯繫
  • 普通用戶
  • 餐廳

每個用戶都擁有自己的能力和訪問權限。意思是,每個人的觀點應該不同。

我已經創建了普通和餐廳的模型。我想知道如何修改我現有的結構來支持這個功能。

public class User : IUser 
{ 
    public User() 
     : this(String.Empty) 
    { 
    } 

    public User(string userName) 
    { 
     UserName = userName; 
     Id = Guid.NewGuid().ToString(); 
    } 

    [Key] 
    public string Id { get; set; } 

    [Required] 
    public string UserName { get; set; } 

    [Required] 
    public string FirstName { get; set; } 

    [Required] 
    public string LastName { get; set; } 

    public string Phone { get; set; } 
    public string MobilePhone { get; set; } 

    [Required] 
    [DataType(DataType.EmailAddress)] 
    public string Email { get; set; } 

    public virtual IList<UserAddress> Addresses { get; set; } 
} 

public class Restaurant 
{ 
    [Key] 
    public int ID { get; set; } 

    [Required] 
    public string Name { get; set; } 

    public virtual IList<RestaurantAddress> Addresses { get; set; } 

    public virtual IList<RestaurantFood> Menu { get; set; } 

    public virtual IList<Review> Reviews { get; set; } 

    [DataType(DataType.Url)] 
    public string Website { get; set; } 

    [DataType(DataType.PhoneNumber)] 
    public string Phone { get; set; } 

    [DataType(DataType.PhoneNumber)] 
    public string Fax { get; set; } 

    [DataType(DataType.EmailAddress)] 
    public string Email { get; set; } 

    public int Seats { get; set; } 

    public double AverageRating { get; set; } 
    public double AveragePrice { get; set; } 
} 
+0

[這](HTTP://www.dotnettips。方式/後/ 1166 /%D9%85%D8%AF%DB%8C D8%%B1%DB%8C D8%%%AA- D8%B3%D9%81%D8%A7%D8%B1%D8% B4%DB%8C-%D8%B3%D8%B7%D9%88%D8%AD-%D8%AF%D8%B3%D8%AA%D8%B1%D8%B3%DB%8C-%DA %A9%D8%A7%D8%B1%D8%A8%D8%B1%D8%A7%D9%86-%D8%AF%D8%B1-mvc)post有幫助 –

+0

@SirwanAfifi謝謝。這在一定程度上有所幫助。我將不得不尋找更多。我的問題是:改變現有模型以增加對這種靈活性的支持的最佳方式是什麼?我應該將所有信息添加到「用戶」模型嗎?我應該將外鍵添加到「User」模型嗎?我想在模型中集成其他信息。 –

+0

@AlirezaNoori我已經更新了我的答案,它可以告訴你如何執行它的確切細節。如果您可以花費大量時間來計算實施,則您不一定需要ASP安全套件。 –

回答

2

我不確定我的Q是否正確,但如果您使用的是互聯網應用程序模板,則可以使用角色管理簡單地管理您的應用程序的訪問控制。

首先,在您的db的webpages_Roles表中添加一些角色。

然後,只需將用戶添加到這些角色:

Role.AddUserToRole("role1"); 

現在,用於過濾的內容,你只需要做兩份工作:

1)過濾器要求使用的,以適當的角色[授權] ATTRIB:

[Authorize(Roles = "role1, role2, ...")] 

2)渲染相應的內容的相對用戶。首先檢索當前用戶的角色:

var roles = Roles.GetRolesForUser(User.Identity.Name); 

然後,根據他/她的角色,渲染內容爲他/她:

bool hasRole1 = roles.Contain("role1") | roles.Contain("admin"); 
// ... 
@if (hasRole1) 
{ 
    // Show content for role1 users... 
} 
+0

非常感謝。雖然大多數人指出我在這個方向,爲了得到你上面提到的代碼,我不得不閱讀幾個樣本。我希望你早些時候發佈。儘管如此,我接受這是明確的答案。 –

+0

@AlirezaNoori - 這是一個很大的樂趣是有幫助的 – AminSaghi

+0

@AminSaghi我們可以使用同樣的事情與我們的自定義表(或不使用「webpages_Roles」表) – kbvishnu

1

授權可以基於用戶角色完成。

創建授權時,我們始終牢記它應該是動態的。新用戶組將擁有不同的權限。所以我所建議的是將信息存儲在數據庫中。

對於如

用戶組 聯繫 普通用戶 Resturants

角色 所有Privileage 基本Privilage 中級Privileage

你需要用行動濾波器,以得到這一點。 http://msdn.microsoft.com/en-us/library/dd410209(v=vs.100).aspx

接下來,我們需要的privilages分配給每個角色

所有Privileage - ADDUSER,addResturant等(可以使用友好的名稱爲行政目的,它可以在用戶界面中顯示,但我們需要存儲控制器。名稱和行動name.In ADDUSER的情況下,好記的名稱將是添加用戶和我們店裏像下面

ActionsTable (actionId, friendName, Controller, Action) 
1 -Add User - Users - Add 

RolesActionMapTable (roleId, actionID) 
1-1 

RolesTable (RoleId,Role Name,Desc) 
1-AllPrivileage 

GroupsTable (GroupId, GroupName) 
1-Admin 

GroupRoleMap (groupId, roleID) 
1-1 

通過繼承授權屬性,並將其應用作爲過濾器的所有方法創建一個自定義Autorize attriute。有一個重載功能,並且您可以檢查用戶是否允許編輯在那裏訪問該操作。因此,您可以阻止未經授權的訪問。

編輯

從路由數據,我們可以找出控制器和動作,所以我們可以分貝使用用戶ID,控制器和動作查詢該是否被允許,你可以得到的用戶組,並檢查它被列入訪問此

EDIT 2

public class CustomAuthorizeAttribute: AuthorizeAttribute 
{ 
    protected virtual bool AuthorizeCore(
    HttpContextBase httpContext) 
{ 
    // 1.Httpcontext can gives you the controller and action 
    // 2. retrive the group of user and check the user is allowed to execute this action 
    // 3. if allowed, then return true else return false. 
    // 4. You can redirect to another page saying you are not allowed to access this action 
    } 
) 
} 


//In controller 
public class EmployeeController: Controller { 

[CustomAuthorize] 
    public Create() 
    { 
    } 

} 

希望允許這有助於

+0

謝謝。我現在有點困惑:D有代碼示例的教程可以幫助我嗎? –

+1

一年前我有同樣的情況。我不能分享代碼並讓我搜索一些教程http://stackoverflow.com/questions/11829937/how-to-show-or-hide-controls-based-on-roles-asp-net-mvc -4-razor – kbvishnu

+0

非常感謝。你能不能幫我更新我的模型?我想讓用戶獲得基本信息並根據用戶類型獲取他/她的擴展信息。我應該使用: '公共虛擬字符串Reestaurant ID {get;組; }'或 '公共虛擬餐廳餐廳{get;組; }' –

0

要通過粒度控制以可擴展的方式實現此目標,您需要基於權限的授權。你可以嘗試類似ASP Security Kit。 ASP安全工具包是從頭開始構建這樣的系統。

編輯:這是它如何工作的:

  1. 你定義一個唯一的代碼的權限與每一個操作方法。例如,CreateRestaurant,ReserveRestaurant
  2. 這些權限代碼存儲在數據庫的主權限表中。
  3. 您可以創建一個單獨的角色表並適當地關聯權限。但是,ASP安全套件引入了implied permissions的新概念,因此您不需要角色作爲單獨的構造;您只需創建更高級別的權限,例如「RestaurantOwner」,並創建其他權限。
  4. 有一個UserPermit表,它將權限與用戶相關聯。對於特定類型的用戶,E.G.餐館老闆,您將在創建用戶時分配適用的權限。
  5. 隨着用戶登錄,您將他的權限加載到內存中。
  6. 只有當用戶擁有與該操作關聯的唯一權限代碼時,您才需要一種機制來控制每個控制器的操作。如果用戶沒有,您會將他重定向到默認頁面,並顯示「未授權操作」消息
  7. 您還可以查看加載的用戶權限以顯示或隱藏菜單選項。

ASP安全工具包爲您完成上述大部分工作;例如,它可以爲automatically infer permission code進行授權,因此您不必對其進行硬編碼。此外,您需要resource checks,以便不同的用戶和餐館老闆不會擺弄其他數據。

披露:我是ASP安全工具包的創建者。

相關問題