您可以在生产环境和开发工作站上使用的一个解决方案。它基于 web.config 应用程序设置中的选项。
<appSettings>
<!
<add key="UseSSL" value="44300" />
</appSettings>
如果不想使用 SSL,请移除密钥。如果使用标准的 SSL 端口 443,请移除值或指定为 443。
接着,使用自定义实现的
RequireHttpsAttribute,该类会处理您的条件。它实际上是从
RequireHttps 派生而来,并使用相同的基础方法实现,只需添加一些条件即可。
public class RequireHttpsConditional : RequireHttpsAttribute
{
protected override void HandleNonHttpsRequest(AuthorizationContext filterContext)
{
var useSslConfig = ConfigurationManager.AppSettings["UseSSL"];
if (useSslConfig != null)
{
if (!string.Equals(filterContext.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase))
{
throw new InvalidOperationException("The requested resource can only be accessed via SSL.");
}
var request = filterContext.HttpContext.Request;
string url = null;
int sslPort;
if (Int32.TryParse(useSslConfig, out sslPort) && sslPort > 0)
{
url = "https://" + request.Url.Host + request.RawUrl;
if (sslPort != 443)
{
var builder = new UriBuilder(url) {Port = sslPort};
url = builder.Uri.ToString();
}
}
if (sslPort != request.Url.Port)
{
filterContext.Result = new RedirectResult(url);
}
}
}
}
不要忘记在AccountController的LogOn方法中进行装饰。
[RequireHttpsConditional]
[HttpPost]
public ActionResult LogOn(LogOnModel model, string returnUrl)
如果您需要通过https提交表单,可以在您的LogOn视图中添加以下内容:
<% using (Html.BeginFormSecure("LogOn", "Account", new { ReturnUrl = Request.QueryString["ReturnUrl"] }, Request.IsSecureConnection, Request.Url)) { %>