我可以使用Session [“role”] =“theRole”,或者这是一个不好的做法,所以我会创建自定义authorize属性,我将调查Session
答案 0 :(得分:4)
一般来说,只要你自己安全起见,它就充其量是值得怀疑的。是否有某些原因你无法使用内置的User对象和IsInRole方法来做出决定?
答案 1 :(得分:3)
我会反对它。 .Net已经拥有大量内置功能来实现安全功能。不要重新发明轮子,特别是在涉及安全的地方。
您无需实施会员提供商。您只需将HttpContext.User
设置为自定义IPrincipal,即可使用User.IsInRole("role")
和[AuthorizeAttribute(Roles="role")]
。
我建议角色信息比会话更适合授权票证。在会话中存储数据可能会导致将会话生命周期与授权票证生命周期同步的额外问题。当用户仍然登录时,会话可能会过期。
答案 2 :(得分:1)
这不错,但好的原则是使用Principal对象并使用成员资格提供程序来回答您对角色的查询。
答案 3 :(得分:1)
如何使用现有的 HttpContext.Current.User ,而不是创建新的Session变量?那是在System.Security.Principal命名空间中。
它有一系列角色可以填充,然后使用if (thisUser.IsInRole("admin"))
进行测试...
仅出于说明目的,这是在手动验证的用户中填充角色的一种方法。在大多数情况下,您已经拥有经过身份验证的用户。
System.Web.Security.FormsIdentity id = new FormsIdentity(new FormsAuthenticationTicket("dok", false, 30));
string[] roles = { "admin" };
HttpContext.Current.User = new System.Security.Principal.GenericPrincipal(id, roles);
答案 4 :(得分:0)
或者,如果您有自定义安全角色,您可以构建自己的类,其中包含您需要的所有信息,然后在登录后将整个类保存到会话中以保存每次需要信息时查询数据库
答案 5 :(得分:0)
自定义授权属性更好,因为它很容易注入操作,并且您的身份验证/授权逻辑还有一个位置。