Как отключить атрибут RequireHttps MVC.NET версии 2? - PullRequest
3 голосов
/ 24 октября 2009

Я вижу, что версия 2 MVC.NET теперь имеет атрибут RequireHttps, который отлично работает для меня. Однако, какова хорошая стратегия для отключения эффекта? Например, я хочу использовать Https на некоторых страницах, но обычный Http на других. Должен ли я создать свой собственный атрибут RequireHttp?

РЕДАКТИРОВАТЬ: я использую свой собственный атрибут RequireHttp, и он отлично работает, но мне интересно, есть ли какие-то встроенные функции в MVC.NET версии 2, которые мне не хватает.

РЕДАКТИРОВАТЬ 2: Я не должен был быть ясным. Мой вопрос касается следующего: если вы используете RequireHttps, то любые запросы после этого будут превышать Https, даже если Controller или Action не украшены RequireHttps. Если я не ошибаюсь, вам нужен второй атрибут, такой как RequireHttp, чтобы перенаправлять запросы в Http вместо Https.

Ответы [ 4 ]

6 голосов
/ 24 октября 2009

Смысл ActionFilterAttribute в том, что вы можете применить их к любым действиям, которые вы хотите. Или, другими словами, вам не нужно применять их ко всем действиям.

Если вы не хотите, чтобы логика атрибута вводилась в действие, просто не применяйте атрибут к нему. Например:

public class SomeController : Controller {
    [RequireHttps]
    public ActionResult SomeAction() {
        //the attribute's logic will be injected to this action.
        return View();
    }

    public ActionResult SomeOtherAction() {
        //this action doesn't require https protocol
        return View();
    }
}

Если вы примените атрибут к самому контроллеру, то он будет применен к всем действиям в контроллере.

Редактировать :

Чтобы требовать протокол http вместо https, я думаю, вы можете использовать атрибут ниже. Я дважды проверю, есть ли у MVC 2 это уже. Но если это не (Это не так):

public class RequireHttp : ActionFilterAttribute {
   public override void OnActionExecuting(ActionExecutingContext filterContext) {
        if (filterContext.HttpContext.Request.IsSecureConnection) {
            UriBuilder builder = new UriBuilder() {
                Scheme = "http",
                Host = filterContext.HttpContext.Request.Url.Host,
                Path = filterContext.HttpContext.Request.RawUrl
            };

            filterContext.Result = new RedirectResult(builder.ToString());
            filterContext.Result.ExecuteResult(filterContext);
        }
        base.OnActionExecuting(filterContext);
    }
}
1 голос
/ 31 марта 2010

У меня это сработало!

Я преобразовал ответ çağdaş в Visual Basic :

Public Class RequireHttpAttribute
    Inherits ActionFilterAttribute

    Public Overrides Sub OnActionExecuting(ByVal filterContext As _
                                           ActionExecutingContext)
        If (filterContext.HttpContext.Request.IsSecureConnection) Then
            Dim builder As UriBuilder = New UriBuilder()
            builder.Scheme = "http"
            builder.Host = filterContext.HttpContext.Request.Url.Host
            builder.Path = filterContext.HttpContext.Request.RawUrl

            filterContext.Result = New RedirectResult(builder.ToString())
            filterContext.Result.ExecuteResult(filterContext)
        End If

        MyBase.OnActionExecuting(filterContext)
    End Sub

End Class

Я использую это так:

<RequireHttp()> _
Public Class SomeController

    <RequireHttp()> _
    Function SomeAction(...) As ActionResult
        ...
    End Function

End Class

Я также использую RemoteRequireHttps Джоэля Мюллера, описанный здесь: ASP.NET MVC требуют HTTPS только в рабочей среде

1 голос
/ 24 октября 2009

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

//apply to all actions
[RequireHttps] 
public class SomeController 
{
    //apply to this action only
    [RequireHttps] 
    public ActionResult SomeAction()
    {
    }

}
0 голосов
/ 24 октября 2009
[RequireHttps] //apply to all actions in controller
public class SomeController
{
    //... or ...
    [RequireHttps] //apply to this action only
    public ActionResult SomeAction()
    {
    }
}

Применение его на уровне контроллера также применяет его ко всем методам действия, в противном случае применяет его к каждому отдельному методу действия.

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