我正在构建ASP.NET MVC应用程序,应用程序将再次检查用户角色&再次决定哪个不显示。
我已经尝试过WebViewPage来创建自定义的htmlhelper。
<p>@Check.isInRole("Admin")</p>
然后使用私有字符串存储用户的角色
private string _Roles { get; set; }
但是_Roles是全球性的并且在所有用户之间共享。
当用户第一次连接到webapp时,我是否只能查询一次DB,然后将所有用户的角色加载到Session变量中?
或
其他解决方法也对我意义重大。请帮忙。
*****我知道我们可以使用ASP NET Membership,不想出于某种原因使用。
答案 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();
}
}