2016-12-15 49 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; 

事实上,问题是相当广泛的。尝试使用建议的解决方案之一,并在遇到困难时回复更具针对性的问题。