Windows Azure - 將使用Access Control Service的網站部屬到Windows Azure

28 August 2012 — Written by Sky Chang
#ASP.NET#ASP.NET MVC#Azure

前一篇有提到使用Access Control Service來整合Facebook的認證,但是那篇講的是ASP.NET MVC在地上然後搭配Windows Azure的Access Control Service,如果今天要把ASP.NET MVC的網站也部屬到Windows Azure,則會因為Identity and Access Tools是使用.NET 4.5的關係,所以會發生部屬不上去的問題 ( 未來Azure支援.NET 4.5,就可以不用理會這篇了~~ ),所以現在,我們必須要把Windows Identity Framework 換成3.5。

首先第一步驟,必須先取得Microsoft.IdentityModel.dll,而且要3.5版本的,小弟的作法是從另外一台有裝Windows Identity Framework 3.5的電腦上面Copy過來的,如果找不到的人可以去Google找找看,或是直接裝Windows Identity Framework 3.5 RuntimeWindows Identity Framework 3.5 SDK。( Windows Identity Framework 3.5 Runtime的下載頁面中,Win6.0代表vista,6.1代表win 7 ,另外裝完後,dll預設會在C:\Program Files\Reference Assemblies\Microsoft\Windows Identity Foundation\v3.5 底下。)

接下來,我們要把Microsoft.IdentityModel.dll引入到ASP.NET MVC的專案

image

小弟我這邊已經把Microsoft.Identity.dll複製到版控裡面,所以位置和預設的位置有點不同。

image

完成之後,接下來要開始修改Web.config檔案,首先我們先找到configSections區段,並且把原本的的Section註解調,替換成舊版的,如下。

  <configSections>
    ...
    <!-- Use to IdentityModel 4.0 
    <section name="system.identityModel" type="System.IdentityModel.Configuration.SystemIdentityModelSection, System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
    <section name="system.identityModel.services" type="System.IdentityModel.Services.Configuration.SystemIdentityModelServicesSection, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
    -->
    <section name="microsoft.identityModel" type="Microsoft.IdentityModel.Configuration.MicrosoftIdentityModelSection, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
  </configSections>

接著,我們把validateRequest加入到Page裡面,如下。

<pages validateRequest="false">

然後,把httpRuntime的requestValidationMode從4.5改成2.0。( 雖然MSDN寫requestValidationMode超過4.0的值,都會被當成4.0,但實際上,4.5的驗證機制是有差的,可以參考附錄的資料 )

<httpRuntime requestValidationMode="2.0" />

接著,我們要把system.webServer裡面的內容替換如下,因為我們不是用System.Identity了,而是使用Microsoft.Identity ( 也就是3.5版本 )。

<system.webServer>
    <modules runAllManagedModulesForAllRequests="true">
      <add name="WSFederationAuthenticationModule" type="Microsoft.IdentityModel.Web.WSFederationAuthenticationModule, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="managedHandler" />
      <add name="SessionAuthenticationModule" type="Microsoft.IdentityModel.Web.SessionAuthenticationModule, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="managedHandler" />
    </modules>
</system.webServer>

最後,system.identityModel的區段、和system.identityModel.Service的區段換成如下,因為要配合上傳到Azure的URL,所以audienceUris裡面的value要填成真實的URI ( 這裡是http://study4.tw ),而中間有一個trustedIssuers,裡面有一個thumbprint的值,可以參考之前system.identityModel的值,後面的name,其實也和之前的system.identityModel的值是一樣的,也就是Access Control Service的網址;最後,最下面的wsFederation裡面,issuer也要填入Access Control Service的URI,而realm和reply則填入真實的網址。( 其實裡面的值和system.identityModel裡面的值都一樣,只是別忘記,我們之前是利用localhost測試,所以填的是http://localhost ,但這邊因為要部屬到Azure上面去了,所以填的必需要是真實網址 )。

 <microsoft.identityModel>
    <service>
      <securityTokenHandlers>
        <securityTokenHandlerConfiguration>
          <audienceUris>
            <add value="http://study4.tw/" />
          </audienceUris>
          <issuerNameRegistry type="Microsoft.IdentityModel.Tokens.ConfigurationBasedIssuerNameRegistry, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">
            <trustedIssuers>
              <add thumbprint="9B8174896FA4C3FCF16587DCA35FF3834F956D19" name="https://Study4ACS.accesscontrol.windows.net/" />
            </trustedIssuers>
          </issuerNameRegistry>
        </securityTokenHandlerConfiguration>
      </securityTokenHandlers>
      <certificateValidation certificateValidationMode="None" />
      <federatedAuthentication>
        <cookieHandler requireSsl="false" />
        <wsFederation passiveRedirectEnabled="true" issuer="https://study4acs.accesscontrol.windows.net/v2/wsfederation" 
                      realm="http://study4.tw/" reply="http://study4.tw/" requireHttps="false" />
      </federatedAuthentication>
    </service>
  </microsoft.identityModel>

到這邊,我們Web.config就設定完成了,接下來,我們要回到Windows Azure的管理介面,進行一些設定;如下圖,我們要進入規則與群組設定。

image

進去後,按下產生。( 預設沒有產生新規則的情況下,通常只會有兩個規則,而底下的圖,是因為小弟已經按過了,所以已經產生了非常多的規則。 )

image

把兩個都打勾,再按下產生。

image

產生後,回如下圖,產生很多新個規則,並按下儲存。

image

接下來,還要調整一下憑證的信任網址。

image

記得領域和傳回URL的部分,要改成真實的網址,不然會沒辦法驗證。

image

儲存後,將整個方案打包好,就可以上傳到Azure了!!這又就完成了!!

image

後記

當然,後面還有一些微調的地方,例如怎樣設定哪個頁面需要驗證;或是整個測試要怎要做之類的,但談下去可能整篇會非常長,而且可能會離主題越來越遠,所以就先此打住了,也請見諒;未來Azure如果搭配.NET 4.5後,也可不在需要這樣做,也期待Azure上的.NET 4.5趕快到來=v=

參考資料

Sky & Study4.TW