授权的自定义角色

时间:2016-03-09 06:36:55

标签: asp.net-mvc asp.net-mvc-5 roleprovider sharepoint-apps

我有一个提供者托管的sharepoint加载项,它在后端使用数据库。此数据库在标有数字的DB中有一些角色,如EmployerEmployee。例如1的{​​{1}}和Employer的{​​{1}},并且每行对应一个共享点电子邮件地址。

在我的加载项中,我想用2属性标记我的所有操作,但我不确定如何继续?如果我创建自定义过滤器,那么这对每个操作意味着什么,我需要调用SP来获取当前登录的用户电子邮件地址 - >查询DB使用它 - >找到角色 - >继续或给予Employee。由于每个操作都已有[Authorize(Role="Employer")],因此会耗费大量时间。

我最初将当前用户详细信息保存在Cookie中(access denied设置为true),但我们知道任何人都可以使用浏览器扩展程序对其进行编辑并模拟用户。

我对MVC很陌生,所以感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

我没有看到任何其他方法,您必须为第一个新请求进行数据库调用,并且后续请求将用户和角色详细信息保存在某个持久对象中。
考虑使用ViewState个对象,并在继续进行数据库调用并再次填充ViewState之前检查null。

答案 1 :(得分:0)

始终避免在Cookie中保存用户详细信息。使用db检查用户访问权限 创建User Access表以检查用户是否有权访问 使用Action Filter,它将在Action执行之前执行。 在控制器

[RoleAccess]
public class AccountController : Controller
{
    public ActionResult Index()
    {
        your code
    }
}

[RoleAccess]是动作过滤功能 在FilterConfig.cs

public class RoleAccessAttribute : ActionFilterAttribute
    {
        private ApplicationDbContext db = new ApplicationDbContext();
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            var controllerName = (string)filterContext.RouteData.Values["controller"];
            var actionName = (string)filterContext.RouteData.Values["action"];
            var userID = HttpContext.Current.User.Identity.GetUserId();

            if (access not accepted)
            {
                //return the user to access denied page
                filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary { 
                {"controller","Error"},
                {"action","Error403"}
                });
            }
        }
    }

如果接受访问权限,则用户有权访问所请求的Action 希望这有帮助