2010-09-11 58 views
33

Khi bạn thiết lập IIS Express lần đầu để bật SSL, mặc định nó sẽ chuyển thành 44300. Thật không may, khi tôi cố gắng truy cập trang web của tôi theo số https://localhost/ nó không hoạt động trừ khi Tôi sử dụng số cổng 44300 - https://localhost:44300/.Mặc định IIS Express tới cổng 44300 cho https khi bật SSL

Các liên kết được tạo ra bằng cách sử dụng sau đây:

<%= Html.ActionLink("Index", "Index", "Home", new { @action = "https://" + Request.Hostname + Url.Action("Index", "Home") }) %> 

Mặc dù một giải pháp xấu xí, từ khóa @action có thể ghi đè lên các tuyến đường được tạo ra, nhưng nó có nghĩa là các ứng dụng sẽ dường như cần phải nhận thức của bất kỳ phi tiêu chuẩn cổng (ví dụ: 44300).

Vấn đề với điều đó là tôi sẽ viết một cái gì đó để giải quyết vấn đề chỉ xảy ra trong môi trường phát triển.

Vì vậy, câu hỏi của tôi là ... Làm cách nào để thay đổi cổng thành 443 và có IIS Express giống như vậy?

Config cho trang web của tôi dưới đây:

<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> 

Nhiều cảm ơn trước.

Cập nhật:

Câu hỏi này đã được answered bởi Divya qua trên các diễn đàn IIS.

Trả lời

25

Câu hỏi này đã được answered bởi Divya trên diễn đàn IIS.

Khi bạn bật SSL cho trang web trong WebMatrix, mặc định là cổng 44300 và thực hiện tất cả các liên kết trong nền. Tôi hy vọng rằng bạn đã cố gắng để thay đổi cổng này để 443 trong tập tin cấu hình. Khi đã xong và lưu, bạn cũng cần sửa đổi ràng buộc trong http.sys. Bạn sẽ cần xóa mục nhập hiện tại cho cổng 44300 và thêm mục nhập cho cổng 443. Để thực hiện việc này, bạn có thể sử dụng httpcfg (WinXp/Win2003) hoặc 'netsh http' (WinVista/Win2K8/Win7). Dưới đây là các lệnh cho netsh:

1) Lấy APPID và certhash cho các mục nhập hiện có của 44300 (Tôi giả định, bạn sẽ sử dụng cùng một chứng chỉ mà WebMatrix cài đặt theo mặc định Nếu bạn muốn thay đổi. giấy chứng nhận là tốt, nhận được chứng chỉ băm của chứng chỉ từ chứng chỉ lưu trữ): netsh http show sslcert. Trong tìm kiếm đầu ra cho mục nhập cho cổng 44300 và sao chép certhash và appID.

2) Xóa mục nhập cho 44300: netsh http delete sslcert ipport=0.0.0.0:44300

3) Thêm một mục mới cho cổng 443 với certhash và AppID sao chép trong bước 1. netsh http add sslcert ipport=0.0.0.0:443 certhash=<certhash> appid=<appid>

Sau khi cấu hình các mục nhập trong http.sys, bạn cần phải khởi động lại dịch vụ http để các thay đổi có hiệu lực.

net stop http

net start http

Theo ghi nhận của người khác, có một số cách tốt đẹp của nhận SSL certs của bạn.

netsh http show sslcert > output.txt 

hoặc (phương pháp ưa thích của tôi):

netsh http show sslcert | clip 
+1

trên máy Win7 của tôi, 'netsh http chương trình sslcert' đã trả lại hơn 100 mục và 44300 ở trên cùng. vì vậy sử dụng lệnh 'netsh http show sslcert | more' hoặc 'netsh http show sslcert> output.txt' để giúp mọi thứ dễ dàng hơn. – rymo

+2

@rymo Là một cách tiếp cận phụ, bạn có thể sử dụng 'netsh http show sslcert ipport = 0.0.0.0: 44300' sẽ lọc xuống phần cụ thể đó. – Alpha

+1

hoặc giải pháp khác: 'netsh http show sslcert | clip' để sao chép kết quả vào clipboard rồi dán nó vào trình soạn thảo văn bản của bạn và tìm kiếm ở đó –

2

Cổng 44300 là tuần tự: 00 có nghĩa là ứng dụng đầu tiên của nó bạn đã cấu hình như SSL được kích hoạt; 01 sẽ là thứ hai và vân vân.

Vì tôi cũng yêu cầu trang web của tôi chỉ hoạt động trong HTTPS bằng cách thêm thuộc tính toàn cầu [RequireHttps], tôi đã gặp sự cố khi gỡ lỗi. Khi ra mắt, nó đã tự động chuyển hướng đến https://localhost/

Để khắc phục vấn đề này khi gỡ lỗi một trang web, tôi chỉ đơn giản là tạo ra một mới RequireHttpsAttribute đó chỉ định cổng

#if DEBUG 
public class RequireHttpsAttribute : System.Web.Mvc.RequireHttpsAttribute 
{ 
    protected override void HandleNonHttpsRequest(System.Web.Mvc.AuthorizationContext filterContext) 
    { 
     base.HandleNonHttpsRequest(filterContext); 

     var result = (RedirectResult)filterContext.Result; 

     var uri = new UriBuilder(result.Url); 
     uri.Port = 44301; 

     filterContext.Result = new RedirectResult(uri.ToString()); 
    } 
} 
#endif 

Sử dụng lớp này khi chỉ gỡ lỗi. Khi được triển khai cho IIS7, bạn nên sử dụng viết lại Url để chuyển hướng đến HTTPS.

+0

Đây chính là điều tôi muốn tránh - có mã cố xử lý tình huống này. Cuối cùng, tôi chuyển sang Windows 7 và IIS 7, có hiệu quả loại bỏ nhu cầu của tôi cho hack này. –

+2

Chắc chắn, khi triển khai, bạn dựa vào phương thức được chứng minh và đáng tin cậy đã được IIS cung cấp, nhưng khi gỡ lỗi, nó rất hữu ích. –

+0

Tuyệt đối.Tôi có thể sẽ thêm các vùng gỡ lỗi vào mã để tránh mã không sản xuất được phát hành. –

0

Vì tôi đã dành nhiều thời gian cho chủ đề này, tôi muốn chia sẻ kết quả tìm kiếm của tôi. Tôi reposting phân đoạn từ bài viết khác của tôi trừ đi mã. Một số nền và giải thích:

========================================= =

Sau khi nghiên cứu aroud, tôi đã có thể giải quyết vấn đề này với IIS Express và ghi đè phương thức OnAuthorization của lớp Điều khiển (Tham chiếu 1). Tôi cũng đã đi với các tuyến đường khuyến cáo của Hanselman (Ref # 2). Tuy nhiên, tôi đã không hoàn hài lòng với hai giải pháp này do hai lý do:

  1. Ref # 1 của OnAuthorization chỉ hoạt động ở mức độ hành động, chứ không phải ở cấp lớp điều khiển
  2. Ref # 2 đòi hỏi rất nhiều thiết lập (Win7 SDK cho makecert), netsh lệnh, và, để sử dụng cổng 80 và cổng 443, tôi cần khởi chạy VS2010 làm quản trị viên, mà tôi cau mày.

Vì vậy, tôi đã đưa ra giải pháp này là khá đơn giản với các điều kiện sau:

  1. Tôi muốn để có thể sử dụng thuộc tính RequireHttps tại điều khiển lớp hoặc hành động mức

  2. Tôi muốn MVC sử dụng HTTPS khi thuộc tính RequireHttps có mặt và sử dụng HTTP nếu nó vắng mặt

  3. Tôi không muốn phải chạy Visual Studio as administrator

  4. Tôi muốn để có thể sử dụng bất kỳ HTTP và HTTPS cổng được sự phân công của IIS nhanh

  5. tôi có thể tái sử dụng các ký tự cert SSL của IIS Express, và tôi không quan tâm nếu tôi thấy Lời nhắc SSL không hợp lệ

==================================== =====

Bạn có thể tìm giải pháp/mã của tôi tại đây ==>ASP.NET MVC RequireHttps in Production Only

+0

Câu trả lời chung là khá giống với Pierre-Alain Vigeant's, nó tách mã phát triển khỏi mã sản xuất. –

0

Dan câu trả lời là đúng, nhưng nếu bạn vẫn còn có vấn đề với cấu hình IIS Express để phục vụ trang web của bạn bằng http và https trên các cổng tiêu chuẩn ở đây là tốt đẹp hướng dẫn rằng hướng dẫn bạn từng bước:

http://www.lansweeper.com/kb/54/How-to-configure-SSL-in-IIS-Express.html

Trong trường hợp của tôi, tôi vô tình xóa chứng chỉ IIS Express. Tôi nghĩ rằng nó được tạo ra lần đầu tiên bạn sử dụng SSL trong Visual Studio (F4 trên dự án được chọn để có được cửa sổ thuộc tính và kiểm tra hộp kiểm 'SSS Enabled'). Hướng dẫn này đã hướng dẫn tôi cách tạo chứng chỉ và sửa nó.

0

Tạo lớp

public class RequireSSLAttribute: RequireHttpsAttribute 
    { 
     protected override void HandleNonHttpsRequest(AuthorizationContext filterContext) 
     { 
      base.HandleNonHttpsRequest(filterContext); 

      if (filterContext.HttpContext.Request.Url.Host.ToLower().Equals("localhost")) 
      { 
       // redirect to HTTPS version of page 
       string localhostSSLPort = System.Configuration.ConfigurationManager.AppSettings["localhostSSLPort"]; 
       string url = "https://" + filterContext.HttpContext.Request.Url.Host + ":" + localhostSSLPort + filterContext.HttpContext.Request.RawUrl; 
       filterContext.Result = new RedirectResult(url); 
      }   
     } 
    } 

Và bên trong cấu hình web của bạn thêm một cái gì đó như thế này

<appSettings>  
    <add key="localhostSSLPort" value="44300"/> 
    </appSettings> 

Và sau đó bạn sử dụng nó như

[RequireSSL]    
    public class AdminController : Controller 
    { 
       ... 
    } 
Các vấn đề liên quan