自定义角色按会话授权

本文关键字:授权 会话 角色 自定义 | 更新日期: 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();
    }
}