Как перенаправить к динамическому URL входа в систему в ASP.NET MVC

95
задан abatishchev 18 September 2012 в 13:52
поделиться

3 ответа

Я думаю, что основной вопрос - то, что, если Вы собираетесь осуществить контрейлерные перевозки на встроенном классе ASP.NET FormsAuthentication (и нет никакого серьезного основания, Вы не были должны), что-то в конце дня собирается звонить FormsAuthentication.RedirectToLoginPage(), который собирается посмотреть на настроенный URL того. Существует только один URL входа в систему, когда-либо, и это, как они разработали его.

Мой удар в проблеме (возможно реализация Rube Goldberg) должен был бы позволить ему перенаправить к единственной странице входа в систему в корне, совместно использованном всеми клиентами, сказать/account/login. Эта страница входа в систему ничего на самом деле не отобразила бы; это осматривает или параметр ReturnUrl или некоторое значение, я вошел в сессию или cookie, который идентифицирует клиент и использование что выпустить непосредственные 302 перенаправления к определенной/client/account/login странице. Это - дополнительное перенаправление, но вероятно не примечательное и это позволяет Вам использовать созданный в механизмах перенаправления.

другая опция состоит в том, чтобы создать Ваш собственный атрибут, как Вы описываете и избегаете чего-либо, что звонит RedirectToLoginPage() метод на FormsAuthentication класс, так как Вы будете заменять его своей собственной логикой перенаправления. (Вы могли бы создать свой собственный класс, который подобен.), Так как это - статический класс, я не знаю ни о каком механизме, которым Вы могли просто ввести свой собственный альтернативный интерфейс и иметь его, волшебно работают с существующим [Авторизовывают] атрибут, который дует, но , люди сделали подобные вещи прежде .

Hope, которая помогает!

30
ответ дан Nicholas Piasecki 24 November 2019 в 05:55
поделиться

В RTM-версии ASP.NET MVC свойство «Отмена» отсутствует. Этот код работает с ASP.NET MVC RTM:

using System;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Resources;

namespace ePegasus.Web.ActionFilters
{
    public class CustomAuthorize : AuthorizeAttribute
    {
        public override void OnAuthorization(AuthorizationContext filterContext)
        {
            base.OnAuthorization(filterContext);
            if (filterContext.Result is HttpUnauthorizedResult)
            {
                filterContext.Result = new RedirectToRouteResult(
                    new System.Web.Routing.RouteValueDictionary
                        {
                                { "langCode", filterContext.RouteData.Values[ "langCode" ] },
                                { "controller", "Account" },
                                { "action", "Login" },
                                { "ReturnUrl", filterContext.HttpContext.Request.RawUrl }
                        });
            }
        }
    }
}

Изменить: Вы можете отключить аутентификацию с помощью форм по умолчанию loginUrl в web.config - на случай, если кто-то забудет, что у вас есть настраиваемый атрибут, и использует встроенный [Authorize] атрибут по ошибке.

Измените значение в web.config:

 <forms loginUrl="~/Account/ERROR" timeout="2880" />

Затем создайте метод действия 'ERROR', который регистрирует ошибку и перенаправляет пользователя на наиболее распространенную страницу входа в систему.

40
ответ дан 24 November 2019 в 05:55
поделиться

Мое решение этой проблемы - специальный класс ActionResult :

    sealed public class RequiresLoginResult : ActionResult
    {
        override public void ExecuteResult (ControllerContext context)
        {
            var response = context.HttpContext.Response;

            var url = FormsAuthentication.LoginUrl;
            if (!string.IsNullOrWhiteSpace (url))
                url += "?returnUrl=" + HttpUtility.UrlEncode (ReturnUrl);

            response.Clear ();
            response.StatusCode = 302;
            response.RedirectLocation = url;
        }

        public RequiresLoginResult (string returnUrl = null)
        {
            ReturnUrl = returnUrl;
        }

        string ReturnUrl { get; set; }
    }
2
ответ дан 24 November 2019 в 05:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: