ASP.NET MVC RequireHttps в производстве только

Я не использую константу для переданного значению параметра. Вызывающая сторона не заботится, изменяете ли Вы параметр или нет, это - деталь реализации.

то, Что действительно важно, должно отметить методы как константу, если они не изменяют свой экземпляр. Сделайте это, когда Вы идете, потому что иначе Вы могли бы закончить с любым много const_cast<> или Вы могли бы найти, что маркировка константы метода требует изменения большого количества кода, потому что это называет другие методы, которые должны были быть отмеченной константой

, я также склонен отмечать локальную константу Вара, если я не должен изменять их. Я полагаю, что это делает код легче понять, облегчая определять "подвижные части".

121
задан Zack Peterson 28 October 2009 в 22:28
поделиться

5 ответов

This won't help if you run Release builds on your development workstation, but conditional compilation could do the job...

#if !DEBUG
[RequireHttps] //apply to all actions in controller
#endif
public class SomeController 
{
    //... or ...
#if !DEBUG
    [RequireHttps] //apply to this action only
#endif
    public ActionResult SomeAction()
    {
    }

}

Update

In Visual Basic, attributes are technically part of the same line as the definition they apply to. You can't put conditional compilation statements inside a line, so you're forced to write the function declaration twice - once with the attribute, and once without. It does work, though, if you don't mind the ugliness.

#If Not Debug Then
    <RequireHttps()> _
    Function SomeAction() As ActionResult
#Else
    Function SomeAction() As ActionResult
#End If
        ...
    End Function

Update 2

Several people have mentioned deriving from RequireHttpsAttribute without providing an example, so here's one for you. I think that this approach would be much cleaner than the conditional compilation approach, and it would be my preference in your position.

DISCLAIMER: I haven't tested this code, even a little bit, and my VB is fairly rusty. All I know is that it compiles. I wrote it based on the suggestions of spot, queen3, and Lance Fisher. If it doesn't work, it should at least convey the general idea, and give you starting point.

Public Class RemoteRequireHttpsAttribute
    Inherits System.Web.Mvc.RequireHttpsAttribute

    Public Overrides Sub OnAuthorization(ByVal filterContext As  _
                                         System.Web.Mvc.AuthorizationContext)
        If IsNothing(filterContext) Then
            Throw New ArgumentNullException("filterContext")
        End If

        If Not IsNothing(filterContext.HttpContext) AndAlso _
            filterContext.HttpContext.Request.IsLocal Then
            Return
        End If

        MyBase.OnAuthorization(filterContext)
    End Sub

End Class

Basically, the new attribute just quits out instead of running the default SSL authorization code, if the current request is local (that is, you're accessing the site through localhost). You can use it like this:

<RemoteRequireHttps()> _
Public Class SomeController

    <RemoteRequireHttps()> _
    Public Function SomeAction() As ActionResult
        ...
    End Function

End Class

Much cleaner! Provided my un-tested code actually works.

129
ответ дан 24 November 2019 в 01:30
поделиться

Унаследование от RequireHttps - хороший подход.

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

Скотт Хансельман имеет отличный ресурс по нескольким способам реализации локального HTTPS с VS2010 и IIS Express.

26
ответ дан 24 November 2019 в 01:30
поделиться

Если вы можете получить и переопределить - сделайте это. Если вы не можете - MVC поставляется с исходными текстами, просто возьмите источники и создайте свой собственный атрибут [ForceHttps], который проверяет IsLocal.

3
ответ дан 24 November 2019 в 01:30
поделиться

Как насчет наследования атрибута RequireHttps в настраиваемом атрибуте. Потом, внутри настраиваемого атрибута проверьте свойство IsLocal текущего запроса, чтобы узнать, исходит ли запрос с локального компьютера. Если да, то не применяйте базовую функциональность. В противном случае вызовите базовую операцию.

9
ответ дан 24 November 2019 в 01:30
поделиться

Поскольку именно сервер разработки ASP.Net вызвал вашу проблему в первую очередь , стоит отметить, что Microsoft теперь имеет IIS Express , который поставляется с Visual Studio (начиная с VS2010 SP1). Это урезанная версия IIS, которая так же проста в использовании, как и сервер разработки, но поддерживает полный набор функций IIS 7.5, включая SSL.

Скотт Хансельман опубликовал подробную статью о работе с SSL в IIS Express .

10
ответ дан 24 November 2019 в 01:30
поделиться
Другие вопросы по тегам:

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