2016-12-15 71 views
0

我正在asp.net(C#)的網站上工作。我想授權每個登錄用戶(限制打開任何用戶沒有權限的網頁)。我有2個表用戶和角色在Sql Server從我想要角色&然後授權該用戶。從c#數據庫授權用戶

回答

1

因爲用戶和角色有多對多的關係,所以用戶和角色之間會有另一個聯結表。比方說,這將是的UserRole

所以,現在對任何要求您將設計一個全球性的過濾器/處理器將執行以下操作:如果你想使用一個存儲過程來驗證用戶接入

var user = Session["UserName"]; // getting logged in user 
var role = // query that junction table **UserRoles** to get all the roles this current user has 
+0

我既不使用asp.net身份也不使用MVC,它是一個簡單的asp.net網站。我只通過sql sp驗證用戶。 –

0

,你將需要:

1)額外的表存儲角色爲用戶 - 姑且稱之爲UserXRole

2)存儲過程或用戶定義的函數來獲取用戶角色或檢查用戶是否具有某個角色。類似以下內容:

CREATE PROCEDURE dbo.UserHasRole 
(
    @UserId INT, 
    -- if you provide role name or code, an extra join with dbo.Role is required 
    @RoleId INT 
) 
AS 
BEGIN 
    DECLARE @result BIT = (CASE 
     WHEN EXISTS (
      SELECT 1 
      FROM dbo.UserXRole X 
      WHERE X.UserId = @UserId AND X.RoleId = @RoleId) THEN 1 
     ELSE 0) 

    RETURN @result   
END 

代碼服從用戶定義的函數限制,所以您可以將其更改爲返回BIT的函數。如果您懷疑認證邏輯將來可能會變得複雜,請將其保留爲存儲過程。

3)呼叫使用當前登錄用戶標識符

每當你驗證用戶身份驗證,我希望把關於用戶登錄到Session對象的一些信息的程序

檢查用戶必須具備某種角色才能執行某些操作意味着使用當前用戶標識(例如Session["UserId"])和所需角色(RoleId)調用存儲過程。

上述方法應該可行,但它可能會導致對您的數據庫的很多調用。更好的方法是:

1)在認證時緩存所有用戶角色 - 當用戶通過認證時,將他/她的所有角色存儲在會話中的列表中。例如: -

Session["CurrentUserRoles"] = rolesFromDb.Select(r => r.RoleId).ToList(); 

2)檢查,如果用戶有一定的作用在內存中只是做。例如:

bool hasSomeRole = (Session["CurrentUserRoles"] as IList<int>)?.Contains(someRoleId) ?? false; 

事實上,問題是相當廣泛的。嘗試使用建議的解決方案之一,並在遇到困難時回覆更具針對性的問題。