按会话自定义角色授权

时间:2016-08-10 06:16:34

标签: c# asp.net-mvc asp.net-mvc-4 session

我正在构建ASP.NET MVC应用程序,应用程序将再次检查用户角色&再次决定哪个不显示。

我已经尝试过WebViewPage来创建自定义的htmlhelper。

<p>@Check.isInRole("Admin")</p>

然后使用私有字符串存储用户的角色

private string _Roles { get; set; }

但是_Roles是全球性的并且在所有用户之间共享。

当用户第一次连接到webapp时,我是否只能查询一次DB,然后将所有用户的角色加载到Session变量中?

其他解决方法也对我意义重大。请帮忙。

*****我知道我们可以使用ASP NET Membership,不想出于某种原因使用。

2 个答案:

答案 0 :(得分:1)

你可以开会。因为它将在整个应用程序中共享,直到会话结束 控制器中的第一个,登录时,将用户的角色保存在会话变量中

Session["UserRole"] = user role

第二视图中你可以得到值

@Session["UserRole"].toString()

希望这会有所帮助

答案 1 :(得分:0)

我已经成功了,如果你有更好的答案,请告诉我。

使用自定义HTML帮助程序,而不是它可以显示基于用户角色的视图/操作链接

@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();
    }
}