如何存储和维护用户访问角色

时间:2016-06-02 13:37:14

标签: c# angularjs sql-server asp.net-web-api

我们有一个应用程序(服务器上的C#,使用AngularJS / Web Apis作为单页面应用程序),为用户分配不同的角色,这些角色存储在数据库中。当用户登录时,用户对象(包括RoleIDRoleName)将转换为JWT并发送给用户,然后用作身份验证。

但是,我们无法确定维护和使用这些访问角色的最佳方式。具体来说,要在当前设置中使用它们,我们似乎必须将角色名称或ID硬编码到应用程序中。

例如,在客户端,如果我们只希望具有Manager角色的用户能够查看并单击按钮,我们必须明确说明,即if (UserService.HasRole('Manager')) { doStuff(); }

相反,我们必须在服务器端做同样的事情(因为每个人都知道依赖客户端安全性很糟糕)。当服务器获取API请求时,它会检查JWT的有效性,如果有效,则检查用户的卷以查看是否允许他们访问特定的Web API端点。

如果重命名角色或ID发生变化,这一切似乎都很容易破裂。我一般不喜欢硬编码这样的东西。是否有更好的方法或方法可以在这里采取?

2 个答案:

答案 0 :(得分:1)

过去,当我们完成RBAC(基于角色的访问控制)时,我们将角色与权限分离,例如。

Role               Permission
===============================
Manager            Create Order
Manager            Delete Order
Till Operative     Create Order
Administrator      Create User
Administrator      Suspend User

这可以存储在数据库中,并缓存在像Redis这样的东西中。两个表,角色和权限,其中权限需要与应用程序中内置的权限相匹配(您可以编写脚本)。

因此,您的权限会随应用程序而增长,例如您添加新的餐饮服务,您可以添加“座位食客”权限。软件现有/成熟位的权限应该很少改变(除非它们写得不正确),而角色完全不流畅,可以重命名等。

然后,您可以使用注释/安全框架来确保在服务器端进行每个API调用的用户具有所需的正确角色。

您甚至可以将其添加为添加剂,并允许用户一次占用多个角色以将各种内容混合在一起。

您可以将用户维护到数据库中的角色映射也在另一个表中(使用FK约束),或者您可以使用LDAP之类的东西从DB /缓存中查找映射。

答案 1 :(得分:0)

在服务器端,Microsoft内置了角色管理功能。我先看看

http://www.asp.net/identity/overview/getting-started/introduction-to-aspnet-identity

然后我还会查看IdentityServer项目,以便在服务器端使用JSON令牌。

https://brockallen.com/2013/04/14/getting-json-web-tokens-jwts-from-adfs-via-thinktecture-identityservers-adfs-integration/

在客户端上,我建议将令牌存储在内存javascript中,或者如果你希望它们存在,我会将它们存储为cookie但确保使用httponly将cookie设置为不能被JavaScript访问创建cookie时的参数。

HTH的