如何在基于ASP.NET MVC的站点中的某些页面上使用HTTPS?
史蒂夫桑德森有一个非常好的教程,如何在预览4上以干燥方式执行此操作:
http://blog.codeville.net/2008/08/05/adding-httpsssl-support-to-aspnet-mvc-routing/
预览5有更好/更新的方式吗?
我已经阅读了之前关于使用RequireHttpsAttribute保护单个控制器的帖子:
ASP.NET MVC RequireHttps仅适用于生产
但有没有办法将其应用到整个网站?由于我的主机(discountasp.net)我不能使用"RequireSSL IIS"设置.
当您最初设置IIS Express以启用SSL时,它会将端口默认为44300.不幸的是,当我尝试访问我的网站时,https://localhost/它不起作用,除非我使用端口号44300 - https://localhost:44300/.
使用以下内容生成链接:
<%= Html.ActionLink("Index", "Index", "Home", new { @action = "https://" + Request.Hostname + Url.Action("Index", "Home") }) %>
Run Code Online (Sandbox Code Playgroud)
虽然这是一个丑陋的解决方案,但@action关键字可以覆盖生成的路由,但这意味着应用程序似乎需要知道任何非标准端口(例如44300).
问题在于我会写一些东西来解决只会在开发环境中出现的问题.
所以我的问题是......如何将端口更改为443并让IIS Express像这样?
我的网站配置如下:
<site name="MySite" id="2" serverAutoStart="true">
<application path="/">
<virtualDirectory path="/" physicalPath="C:\Inetpub\MySite" />
</application>
<bindings>
<binding protocol="http" bindingInformation=":80:" />
<binding protocol="https" bindingInformation=":44300:" />
</bindings>
</site>
Run Code Online (Sandbox Code Playgroud)
提前谢谢了.
更新:
Divya已经在IIS论坛上回答了这个问题.
我希望我的登录页面只是SSL:
[RequireHttps]
public ActionResult Login()
{
if (Helper.LoggedIn)
{
Response.Redirect("/account/stats");
}
return View();
}
Run Code Online (Sandbox Code Playgroud)
但显然,当我开发和调试我的应用程序时,它无法在localhost上运行.我不想将IIS 7与SSL证书一起使用,如何自动禁用RequireHttps属性?
更新
基于StackOverflow用户和ASP.NET MVC 2源代码提供的信息,我创建了以下类来解决问题.
public class RequireSSLAttribute : FilterAttribute, IAuthorizationFilter
{
public virtual void OnAuthorization(AuthorizationContext filterContext)
{
if (filterContext == null)
{
throw new ArgumentNullException("filterContext");
}
if (!filterContext.HttpContext.Request.IsSecureConnection)
{
HandleNonHttpsRequest(filterContext);
}
}
protected virtual void HandleNonHttpsRequest(AuthorizationContext filterContext)
{
if (filterContext.HttpContext.Request.Url.Host.Contains("localhost")) return;
if (!String.Equals(filterContext.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase))
{
throw new InvalidOperationException("The requested resource can only be accessed via SSL");
}
string url = "https://" + filterContext.HttpContext.Request.Url.Host …Run Code Online (Sandbox Code Playgroud) 如何使用ASP.NET MVC 2 Preview 2 Futures RequireHttps属性?
我想防止将不安全的HTTP请求发送到操作方法.我想自动重定向到HTTPS.
MSDN:
我该如何使用此功能?
到目前为止,我的https部署通常涉及使用https对整个站点的简单锁定,并在Web服务器上提供http-to-https重定向.
我现在计划在一个包含http和https页面的单个ASP.NET MVC站点(在云上).因此,该站点将有2个概念(非物理)区域,提供安全和非安全请求.
在配置方面,我已经为80和443设置了输入端口,并且该站点接受这两个请求.
有什么方法可以将协议转换为https,以进行属于安全区域的操作的任何调用吗?例如,动作过滤器可以执行的操作.
非常感谢.
编辑: 请注意,这样做的全部意图是避免在表单操作属性上使用绝对URL,因为可移植性问题以及用户将不会在浏览器上看到https://保证可视提示.
P
我有一些MVC2网站有很多[RequireHttps].
但是当我调试它时,我必须在不同的地方(控制器)评论它们中的许多.代码准备好后,我必须删除所有注释.
所以需要时间,有时我忘了取消注释[RequireHttps]:)
我的问题是哪个是解决此问题的最佳做法?
谢谢!
我看到MVC.NET的第2版现在有一个RequireHttps属性,这对我很有用.然而,什么是关闭效果的好策略?例如,我想在某些页面上使用Https,但在其他页面上使用常规Http.我应该创建自己的RequireHttp属性吗?
编辑:我使用自己的RequireHttp属性,它工作正常,但我想知道在MVC.NET版本2中是否有一些我缺少的内置功能.
编辑2:我一定不清楚.我的问题涉及以下内容:如果您使用RequireHttps,那么之后的任何请求都将超过Https,即使Controller或Action未使用RequireHttps进行修饰.除非我弄错了,否则你需要第二个属性,例如RequireHttp,将请求重定向到Http而不是Https.