Аутентификация из Active Directory, но авторизация ролей из базы данных SQL в MVC - PullRequest
0 голосов
/ 01 марта 2019

Я новичок в MVC.Я искал и не нашел решения, соответствующего моим требованиям.

Я разрабатываю веб-портал для внутреннего использования нашей командой, в котором для входа используется аутентификация Windows AD.Однако для доступа на основе ролей я создал локальную базу данных, которая может возвращать детали роли для пользователя.Я создал собственный фильтр авторизации, который позволяет мне обрабатывать авторизацию в зависимости от роли пользователя.Этот фильтр запрашивает детали из БД, однако проблема с этим подходом заключается в том, что он будет пытаться получать детали из БД для каждого запроса к контроллеру, что удорожает.

Как сохранить данные пользователя, извлеченные изБД в токене, так что мне не нужно запрашивать БД для каждого запроса и использовать значения токена внутри фильтра авторизации.Кроме того, я могу использовать значения, извлеченные для пользователя из базы данных, в любом месте приложения.(Есть некоторые другие детали для пользователя, которого мы имеем в базе данных).

Если кто-то может предложить лучший способ добиться этого, пожалуйста, помогите.

Вот код, который я сейчас используюиспользуя внутренний фильтр авторизации:

public class AuthorizeRole : AuthorizeAttribute
{
    private bool _authenticated;
    private bool _authorized;

    public string InRoles { get; set; }

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        base.HandleUnauthorizedRequest(filterContext);

        if (_authenticated && !_authorized)
        {
            filterContext.Result = new RedirectResult("/account/error");
        }
    }

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        _authenticated = base.AuthorizeCore(httpContext);

        if (_authenticated)
        {
            if (string.IsNullOrEmpty(InRoles))
            {
                _authorized = true;
                return _authorized;
            }

            if (!string.IsNullOrEmpty(httpContext.User.Identity.Name))
            {
                string NTID = httpContext.User.Identity.Name.Split('\\')[1];
                var roles = InRoles.Split(',');

                using (Models.UserAuthEntities userAuthEntities = new Models.UserAuthEntities())
                {
                    try
                    {
                        ObjectResult<Models.Validate_User_Login_Result> userResults = userAuthEntities.Validate_User_Login(NTID);
                        var user = userResults.FirstOrDefault(all => all.NTID == NTID);

                        if (user == null)
                        {
                            _authorized = false;
                            return _authorized;
                        }
                        else
                        {
                            if (roles.Contains(user.Role))
                            {
                                return _authorized;
                            }
                        }
                    }
                    catch (Exception)
                    {
                        _authorized = false;
                        return _authorized;
                    }
                }
            }
            else
            {
                _authorized = false;
                return _authorized;
            }
        }

        _authorized = false;
        return _authorized;
    }
}

Пожалуйста, предложите, в каком разделе использовать код, который вы будете предлагать (например, внутри контроллера, внутри фильтра или где-то еще.)

Я нашел это решениепо адресу: этот сайт но там он используется для групп AD.

Ответы [ 2 ]

0 голосов
/ 21 марта 2019

Я проверил cookie в переопределенной версии метода AuthorizeCore, теперь он работает:

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        string cookieName = FormsAuthentication.FormsCookieName;
        HttpCookie authCookie = httpContext.Request.Cookies[cookieName];
        _authenticated = base.AuthorizeCore(httpContext);
        string authToken = httpContext.Request.Headers["Auth-Token"];

        if (_authenticated)
        {
            if (authCookie == null)
            {
                if (string.IsNullOrEmpty(InRoles))
                {
                    _authorized = true;
                    return _authorized;
                }

                if (!string.IsNullOrEmpty(httpContext.User.Identity.Name))
                {
                    string NTID = httpContext.User.Identity.Name.Split('\\')[1];
                    var roles = InRoles.Split(',');

                    using (Models.UserAuthEntities userAuthEntities = new Models.UserAuthEntities())
                    {
                        try
                        {
                            ObjectResult<Models.Validate_User_Login_Result> userResults = userAuthEntities.Validate_User_Login(NTID);
                            var user = userResults.FirstOrDefault(all => all.NTID == NTID);

                            if (user == null)
                            {
                                _authorized = false;
                                return _authorized;
                            }
                            else
                            {
                                if (roles.Contains(user.Role))
                                {
                                    _authorized = true;
                                    return _authorized;
                                }
                            }
                        }
                        catch (Exception)
                        {
                            _authorized = false;
                            return _authorized;
                        }
                    }
                }
                else
                {
                    _authorized = false;
                    return _authorized;
                }
            }
        }

        _authorized = false;
        return _authorized;
    }
0 голосов
/ 01 марта 2019

Прежде всего, вы можете рассмотреть использование групп безопасности AD для управления доступом.Таким образом, OPS может продолжать поддерживать доступ в знакомой проверенной временем платформе, и вам не нужно писать собственный интерфейс определения безопасности.

Что касается сохранения безопасности MVC Все, что вам нужно сделать, это добавить ручной вход в систему.чтобы выполнить указанную выше логику, а затем вы используете встроенного поставщика членства (для любой версии MVC, которую вы используете) для входа в систему пользователя. MVC будет обрабатывать поддержание зарегистрированного состояния и токенизацию для вас, и вы можете указать такие вещи, как тайм-аутв файле web.config (или settings.json в Core).

Извините, у меня нет примера кода для иллюстрации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...