0

我正在使用 asp.net(C#) 的网站。我想授权每个登录的用户(限制打开任何用户无权的网页)。我在 Sql Server 中有 2 个表用户和角色,我想从中获取角色然后授权该用户。

4

2 回答 2

1

由于用户和角色具有多对多关系,因此用户和角色之间将存在另一个联结表。假设它是UserRoles

因此,现在根据任何请求,您将设计一个全局过滤器/处理程序,它将执行以下操作:

var user = Session["UserName"]; // getting logged in user
var role = // query that junction table **UserRoles** to get all the roles this current user has
于 2016-12-15T05:36:37.487 回答
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;

事实上,这个问题相当广泛。尝试其中一种建议的解决方案,并在遇到困难时提出更有针对性的问题。

于 2016-12-15T06:10:03.750 回答