Почему веб-приложение MVC не отражает добавления разрешений в модели безопасности на основе SQL Server - PullRequest
0 голосов
/ 01 ноября 2019

Я создал веб-приложение MVC 5 для интранета в компании, в которой я работаю. Он построен с использованием проверки подлинности Windows и олицетворяет пользователя приложения.

В бэкэнде имеется централизованная база данных безопасности, в которой есть таблица сотрудников, таблица ролей и таблица мостов для объединения обоих.

Существует представление MVC, которое в основном сводится к данным с сотрудниками и разрешениями. Пользователи подключаются к веб-приложению, веб-приложения считывают имя пользователя и проверяют SQL Server, чтобы увидеть, какие разрешения они имеют. Поэтому администраторам очень легко разрешить использование сайта с хорошим интерфейсом.

enter image description here

Вот проблема - когда я назначаю разрешение «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 действие при достижении соответствующего маршрута, а затем выполняет новый поискразрешения во время выполнения действия?

1 Ответ

0 голосов
/ 11 ноября 2019

Наконец-то решена проблема. Благодаря реализации оператора с использованием в классе MenuSecurity соединение удалялось после каждого использования, таким образом каждый раз получая свежие записи. Для этого я использовал метод инициализации и вызывал его каждый раз, когда создавал новый экземпляр безопасности меню.

Вот обновленный класс:

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 bool isOnSystem;
        private bool isDMPAdmin;
        private bool isEIPAdmin;
        private bool isEIPUser;
        private bool isStandardReportingAdmin;
        private bool isStandardReportingEntityUser;
        private bool isStandardReportingMasterDataContributer;
        private bool isStandardReportingUser;

        public void Initialize()
        {
            using (var _context = new SecurityDbContext())
            {

                var employeeRole = _context.vEmployeeRoles.SingleOrDefault(er => er.Username == Environment.UserName);
                isOnSystem = employeeRole != null ? true : false;
                isDMPAdmin = employeeRole.DMPA;
                isEIPAdmin = employeeRole.EIPA;
                isEIPUser = employeeRole.EIPU;
                isStandardReportingAdmin = employeeRole.SRPA;
                isStandardReportingEntityUser = employeeRole.SRPE;
                isStandardReportingMasterDataContributer = employeeRole.SRPM;
                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;
            }
        }


    }
}
...