2015-05-11  772 views 评论

MVC 中局部使用HTTPS(SSL)加密传输

MVC中局部使用HTTPS(SSL)加密传输

导读:

Step1: 全局重写URL
Step2: 代码重构,扩展重写AuthorizeAttribute标签实现部分Action重写URL
Step3: 开启IIS Express HTTPS服务

一. 强制重写URL
在MVC中实现URL重写为HTTPS有两种方式:方式1:在Global.asax中添加全局的注册信息,强制将所有页面全部强制转换为HTTPS方式。方式2:使用方式1的方法会导致全局均使用https会导致性能变差,实际上也不需要全局都使用只需要在考虑安全因素较高的地方即可,如登录注册等。这时我们只需要重写AuthorizeAttribute这个特性标签即可。 (通过重写权限验证特性标签方式实现URL强制重写的方法需要感谢iDotNetSpace大大的博文帮助)重写AuthorizeAttribute如下:

    public class IRequireHttpsAttribute : AuthorizeAttribute

    {

        public override void OnAuthorization(AuthorizationContext filterContext)

        {

            base.OnAuthorization(filterContext);

            // 如果已经是https连接则不处理,否则重定向到https连接

            if (!filterContext.HttpContext.Request.IsSecureConnection)

            {

                // 获取当前请求的Path

                string path = filterContext.HttpContext.Request.Path;

                // 从web.config中获取host,也可以直接从httpContext中获取

                string host = System.Configuration.ConfigurationManager.AppSettings["HostName"];

                // 从web.config中获取https的端口

                string port = System.Configuration.ConfigurationManager.AppSettings["HttpsPort"];

                // 如果端口号为空表示使用默认端口,否则将host写成host:port的形式

                if (port != null)

                {

                    host = string.Format("{0}:{1}", host, port);

                }

                // 重定向到https连接

                filterContext.HttpContext.Response.Redirect(string.Format("https://{0}{1}", host, path));

            }

        }

}

由于HTTP和HTTPS使用的端口可能不相同,所以在Webconfig下需要声明端口号以及主机名,如下所示:

  <appSettings>

    <add key="HostName" value="localhost"/>

    <add key="httpsPort" value="44300"/>

</appSettings>

直接在强制转换的为HTTPS的Action上使用这个自定义的扩展标签,sample如下:

[IRequireHttps]

public ActionResult Login()

{

    ViewBag.Title = "Login";

    return View();

}

二.出现的异常及处理
直接运行访问会发现出现403错误,这个原因有两种:

1. 如果你只是在VS中运行也就是使用IIS Express运行,那需要开启并配置IIS Express
1)将 IIS Express 自带的 localhost 证书从 Certificate(local computer) - Personal 目录 移动到  Certificate(local computer)- Trusted Root Certificaiton Authorities 目录

2)打开位于 C:\Users\[Username]\Documents\IISExpress 目录下的 IIS Express 配置文件。 打开 applicationhost.config 文件。 找到你的Web项目所在的 Site 节点并配置即可:

<site name="WebApp" id="27">

     <application path="/" applicationPool="Clr4IntegratedAppPool">

           <virtualDirectory path="/"physicalPath="D:\MyProgrames\ASP.NET\WCF\CustomWcfUseIoc\Carrot.CustomWCF\WebApp" />

     </application>

     <bindings>

           <binding protocol="http" bindingInformation="*:64795:localhost" />

           <binding protocol="https" bindingInformation="*:44300:localhost" />

     </bindings>

</site>

2.如果已经配置在本机的IIS服务器下,则需要配置IIS下的HTTPS安全认证,此处不具体详解,度娘即可。 此时再运行又会出现异常情况,报出HTTP 错误 401.0 – Unauthorized。很明显只是个权限的问题,只是笔者在解决这个问题的时候走了很多弯路,各种设置文件夹权限,其实此处只需要在Action上设置一个名为AllowAnonymous的特性标签即可,如下所示:

[IRequireHttps]

[AllowAnonymous]

public ActionResult Login()

{

     ViewBag.Title = "Login";

     return View();

}

运行效果如下:

psb

给我留言

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: