2016-03-09 19 views
2

У меня есть поддерживаемая sharepoint надстройка поставщика, которая использует базу данных на задней панели. Эта база данных имеет некоторые роли, такие как Employer и Employee в БД с номером. Например, 1 для Employer и 2 для Employee и соответствует каждой строке адрес электронной почты sharepoint.Пользовательские роли для авторизации

В моей надстройке я хочу отметить все свои действия атрибутом [Authorize(Role="Employer")], но я не уверен, как действовать дальше? Если я создаю настраиваемый фильтр, значит, это означает для каждого действия, мне нужно вызвать SP, чтобы получить текущий зарегистрированный адрес электронной почты пользователя -> БД запроса, используя его -> найти роль -> продолжить или дать access denied. Он будет потреблять много времени, поскольку на каждом действии уже есть SPContextFilter.

Я изначально сохранял текущие данные пользователя в файле cookie (HttpOnly установлен в true), но узнал, что любой может редактировать его с помощью расширения браузера и выдавать себя за пользователей.

Я довольно новичок в MVC, поэтому любая помощь оценивается.

ответ

1

Я не вижу другого пути, вам нужно будет сделать вызов БД для первого нового запроса и для последующих запросов сохранить данные о пользователе и роли в каком-то постоянном объекте.
Рассмотрите возможность использования объектов ViewState и, возможно, проверьте нуль, прежде чем приступать к вызову базы данных и снова заполняйте ViewState.

+0

Спасибо за ответ Varun, я, конечно, проверить этот подход – Garima

0

Всегда избегайте сохранения сведений о пользователе в cookie. Проверьте доступ пользователя с помощью db.
Создать User Access Таблица, чтобы проверить, имеет ли пользователь доступ или нет
Используйте Action Filter, который будет выполнен до выполнения действия. В контроллере

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

The [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
надеются, что это помогает

+0

Спасибо за ответьте и. Основная проблема заключается в том, что мой текущий идентификатор пользователя будет получен из sharepoint, и я проверю доступ пользователей из базы данных. Эта проверка на каждое действие сделает приложение очень медленным, поэтому я планирую использовать кеш/сеанс для поддержания некоторого состояния. – Garima

+0

Это может быть связано с надстройками SP в целом, но то, что мешает людям получить доступ к вашему провайдеру, размещенному веб-интерфейсом напрямую, входить со своими учетными данными SharePoint Online - я знаю, что вы получите сообщение об ошибке «Приложение с indetified» XYZ 'не установлен ", но определенно нет способа сказать, создают ли они свой собственный добавочный номер и используют тот же уникальный идентификатор? –