У меня есть конечная точка Web Api 2, которую я пытаюсь защитить с помощью специального атрибута Authorize.Внутри этого атрибута я проверяю, есть ли у пользователя необходимые роли, такие как:
if (!user.HasRoleInInstitution(institutionId, Role.SomeRole))
{
filterContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized);
return;
}
Проблема, с которой я сталкиваюсь - это идентификатор института.Конечная точка должна быть доступна в контексте учреждения, в котором каждый пользователь может иметь разные роли в разных учреждениях, поэтому проверка должна проверять, есть ли у пользователя роли в данном учреждении, к которому обращается пользователь.
Я мог бы сохранить доступный в данный моментinstituId в Session, например:
var session = HttpContext.Current.Session;
Это, однако:
A) Против принципов REST, поскольку конечная точка не должна иметь состояния
B) Доступ к сеансам обычно занимает много времени, поэтомуэто приводит к снижению производительности в недопустимых сценариях, таких как Авторизация.
Я мог бы также передавать идентификатор института от клиента при каждом запросе, а затем использовать RouteData для извлечения его в атрибуте, например:
var institutionId = filterContext.ControllerContext.RouteData["institutionId"];
Проблема с этим подходом заключается в следующем:
A) Если другой разработчик использует «someInstitutionId» вместо «instituId» в качестве параметра маршрута, тогда эта проверка прекратит
B) Передача институтаId вкаждый запрос - ужасная трата пропускной способности
Finally Я мог бы просто добавить в текущий момент доступную учетную запись для учреждения или передать файлы cookie, но это вынуждает пользователя перезаписываться каждый раз, когда он хочет использовать другое учреждение, и он не может открыть несколько экземпляров приложения для разных учреждений, что является жестким требованием..
Каков наилучший подход для подобных сценариев?