大约6个月前,我推出了一个网站,每个请求都需要通过https.当我找到确保页面的每个请求都通过https的唯一方法是在页面加载事件中检查它.如果请求不是通过http,我会response.redirect(" https://example.com ")
有没有更好的方法 - 理想情况下web.config中的一些设置?
我想使用RequireHttpsAttribute来防止将不安全的HTTP请求发送到操作方法.
C#
[RequireHttps] //apply to all actions in controller
public class SomeController
{
[RequireHttps] //apply to this action only
public ActionResult SomeAction()
{
...
}
}
Run Code Online (Sandbox Code Playgroud)
VB
<RequireHttps()> _
Public Class SomeController
<RequireHttps()> _
Public Function SomeAction() As ActionResult
...
End Function
End Class
Run Code Online (Sandbox Code Playgroud)
不幸的是,ASP.NET Development Server不支持HTTPS.
如何在发布到生产环境时使我的ASP.NET MVC应用程序使用RequireHttps,而不是在ASP.NET Development Server上的开发工作站上运行时?
我希望我的登录页面只是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) 一些背景知识:我们要求所有DTO对象都是可序列化的,以便它们可以存储在会话中或缓存中.
您可以想象,这非常烦人且容易出错...是否有任何自动化方式(理想情况下作为构建过程的一部分)使用Visual Studio 2010来确保命名空间中的所有类都使用[Serializable]属性进行标记?