Я создал веб-приложение MVC 5 для интранета в компании, в которой я работаю. Он построен с использованием проверки подлинности Windows и олицетворяет пользователя приложения.
В бэкэнде имеется централизованная база данных безопасности, в которой есть таблица сотрудников, таблица ролей и таблица мостов для объединения обоих.
Существует представление MVC, которое в основном сводится к данным с сотрудниками и разрешениями. Пользователи подключаются к веб-приложению, веб-приложения считывают имя пользователя и проверяют SQL Server, чтобы увидеть, какие разрешения они имеют. Поэтому администраторам очень легко разрешить использование сайта с хорошим интерфейсом.
Вот проблема - когда я назначаю разрешение «SRPE»я (что успешно добавляет запись в таблицу мостов), я ожидаю увидеть это изменение. По сути, это разрешение, если оно истинно, заставляет MVC возвращать альтернативное представление для одного из построенных мной представлений. В любом случае, это не работает.
Фактический результат - ничего не происходит, то есть возвращается тот же самый вид. Кстати, это все работает от VS на данный момент. Так что случайно мне удалось вызвать ошибку в приложении во время какой-то другой операции, и, как ни странно, когда я исправил ошибку и перезапустил сайт, разрешение было отражено.
Чего я не понимаю, так это почему разрешениене отражается во время выполнения. Этот шаблон дизайна я использовал повсюду. Класс безопасности выглядит следующим образом:
using System;
using System.Linq;
using MDMWebApp.Models;
namespace MDMWebApp.Security
{
public class MenuSecurity
{
// DMPA DMP Admin
// EIPA EIP Admin
// EIPU EIP User
// SRPA Standard Reporting Admin
// SRPE Standard Reporting Entity User
// SRPM Standard Reporting Master Data Contributer
// SRPU Standard Reporting User
private static SecurityDbContext _context = new SecurityDbContext();
private vEmployeeRole employeeRole = _context.vEmployeeRoles.SingleOrDefault(er => er.Username == Environment.UserName);
private bool isOnSystem => employeeRole != null ? true : false;
private bool isDMPAdmin => employeeRole.DMPA;
private bool isEIPAdmin => employeeRole.EIPA;
private bool isEIPUser => employeeRole.EIPU;
private bool isStandardReportingAdmin => employeeRole.SRPA;
private bool isStandardReportingEntityUser => employeeRole.SRPE;
private bool isStandardReportingMasterDataContributer => employeeRole.SRPM;
private bool isStandardReportingUser => employeeRole.SRPU;
public bool CanUseSystem
{
get { return isOnSystem; }
}
public bool DMPAdmin
{
get
{
return isDMPAdmin;
}
}
public bool EIPAdmin
{
get
{
return isDMPAdmin || isEIPAdmin;
}
}
public bool CanSeeEIP
{
get
{
return isDMPAdmin || isEIPAdmin || isEIPUser;
}
}
public bool StandardReportingEntityUser
{
get
{
return isStandardReportingEntityUser;
}
}
public bool StandardReportingMasterDataContributer
{
get
{
return isDMPAdmin || isStandardReportingAdmin || isStandardReportingMasterDataContributer;
}
}
}
}
и соответствующий контроллер / действие:
public ActionResult TaskTracker()
{
var lastWeekEnding = DateTime.Now.AddDays(-7);
var taskTracker = _context.TaskTracker.Where(d => d.WeekEnding >= lastWeekEnding);
MenuSecurity ms = new MenuSecurity();
if (ms.StandardReportingEntityUser)
{
return View("TaskTrackerEntity",taskTracker);
}
else return View("TaskTracker", taskTracker);
}
Не выполняет ли MVC действие при достижении соответствующего маршрута, а затем выполняет новый поискразрешения во время выполнения действия?