自定义角色按会话授权
本文关键字:授权 会话 角色 自定义 | 更新日期: 2023-09-27 18:01:42
我正在构建ASP。. NET MVC应用程序,应用程序将再次检查用户角色&再一次决定哪个显示哪个不显示。
我已经尝试WebViewPage创建自定义的htmlhelper。
<p>@Check.isInRole("Admin")</p>
然后使用私有字符串存储用户的角色
private string _Roles { get; set; }
但是_Roles是全局的,并且在所有用户之间共享。
是否有一种方法,我可以查询DB只有一次当用户连接到webapp的第一次,然后加载所有用户的角色到会话变量?
或
其他变通方法对我来说也很重要。请帮助。
*****我知道我们可以使用asp.net会员,但由于某些原因不想使用
您可以会话。因为它将在整个应用程序中共享,直到会话结束。
1 .在控制器中,登录时,将用户角色保存在会话变量
Session["UserRole"] = user role
第二个视图你可以得到值
@Session["UserRole"].toString()
希望能有所帮助
我已经做了,如果你有更好的答案,请一定告诉我。
与自定义的HTML Helper,而不是它可以显示基于用户角色的视图/操作链接
@if(tech.isInRole("Admin,Developer"))
{
//It will show the link only if the user have the above roles
@Html.ActionLink(......);
}
下面是自定义HTML Helper
的代码public abstract class tech : WebViewPage
{
public static bool isInRole(string roles) {
string ID = HttpContext.Current.User.Identity.Name;
//This if to skip query Db, if user are in the same session
if (HttpContext.Current.Session["roles"] == null)
{
var db = new UserDbContext();
HttpContext.Current.Session["roles"] = db.UserRoles
.Where(a => a.User.Username == ID)
.Select(a => a.Role.Rolename).ToArray();
}
string[] arrRole = (string[])(HttpContext.Current.Session["roles"]);
char[] delimiters = new char[] { ',' };
string[] inRoles = roles.Split(delimiters, StringSplitOptions.RemoveEmptyEntries);
return arrRole.Intersect(inRoles, StringComparer.OrdinalIgnoreCase).Any();
}
}