2014年12月11日

在Cloud Service上安裝Chained Certificate以設定SSL連線

在Cloud Service上設定SSL連線時,我們會需要透過Portal上傳憑證並在VS Project中指定需要使用的憑證;某些憑證本身已經包含中繼或ROOT憑證時,我們會需要在VS Project中做一些額外的設定。

  • 首先透過Portal將我們的憑證上傳到Cloud Service時,會發現除了我們上傳的那張之外,Portal上還多出了ROOT跟中繼憑證。

image

  • 回到我們的VS Project,這邊我們需要將這三張憑證設定到我們欲安裝的憑證列表中;點選WebRole然後按右鍵選擇Property,然後切換到Certificate頁簽

image

  • 首先將Server的Certificate加入,並指定Store為My (Thumbprint可以直接手動輸入即可)

image

  • 然後指定ROOT與中繼憑證,指定Store為CA (Thumbprint可以直接手動輸入即可)

image

  • 接著切換到Endpoint頁簽,新增一個HTTPS Endpoint,並指定要使用Server Certificate作為SSL憑證

image

  • 接著便可以佈署到雲端上了

2014年11月11日

[Azure]使用Azure MFA來保護你的網站–MFA Server篇

Azure Multi-Factor Authentication提供了帳號密碼之外的另一個保護機制,透過電話、簡訊或是Mobile App的驗證;讓使用者存取網站更安全。

有兩種方式可以來保護現有的網站:透過安裝MFA Server在本地端機器上、或是透過程式碼呼叫API的方式;本文會介紹如何透過MFA Server來做Multi-Factor驗證。

首先,我們需要在Azure上建立一個Multi-Factor提供者

image

建立完畢後,RDP到Web Server上。

由於我們的網站是使用ASP.Net驗證,因此需要先將網站的Application Pool的身分設定為Local System;這是必要條件。

然後進入MFA管理介面

image

在介面的左方下載並安裝MFA Server

image

安裝完成後便會看到設定畫面

image

按下下一步之後,會需要輸入啟用的帳號密碼,這個帳號密碼可以在MFA管理介面上產生

image

回到MFA管理介面,按下Generate Activation Credentials按鈕

image

將產生的帳號密碼輸入到剛剛的欄位上就可以了

image

驗證完帳號密碼後,接下來要給這個MFA Server Group一個名稱;由於是第一次建立,因此我們可以選擇建立新的Group或是接受現有的預設的Group

這裡我給予一個新Group,叫做IIS3

image

因為是第一台Server,所以這裡按下一步就可以了

image

設定要保護的應用程式類型,這邊我們選擇WebSite;稍後我們可以增加其他服務。

image

這裡我們以IIS作為範例

image

接著要選擇網站的驗證方式是Form驗證還是HTTP驗證,稍後可以修改,在這個例子中,我們選擇HTTP驗證;如果您的網站是透過ASP.Net MVC Template建立的,請選擇HTTP驗證

image

在這裡輸入網站的網址

image

這樣就設定完成了

image

完成後就會進入管理介面

image

點選Status,系統有找到目前的MFA Server,但是卻看到一個警告訊息,表示”Require MFA user match”未勾選

image

由於MFA Server並不知道我們網站的使用者資料是存在哪裡,因此我們必須將使用者資料匯入一份到MFA Server中。

Require Multi-Factor Authentication user match的意思是說,當使用者透過帳號密碼登入完成之後,MFA Server是否需要比對使用者的帳號與MFA Server中的使用者帳號是否一致。如果勾選,表示兩者必須一致。這裡我們編輯網址的設定,啟用MFA user match

image

接著,切換到Native Module頁簽,設定要受到保護的網站

image

因為啟用了User match,因此我們需要在MFA Server中建立新的使用者

image

輸入所有相關資訊,特別是電話號碼

image

新增完後又發現警告訊息

image

到Company Setting中指定透過Case-sensitive string match來驗證user name

image

接著實際登入看看

image

果然收到MFA的電話驗證了!

image

2014年10月27日

[IIS]在Azure WebSite服務上透過URL Rewrite Module將前端HTML的要求轉給ASPX處理

有兩種方式

1. 透過URL Rewrite的Rewrite轉址

在的web.config中加入以下這一段設定

<configuration>

<!--- Ommitted à

<system.webServer>

        <rewrite>

            <rules>

                <rule name="TEST" stopProcessing="true">

                    <match url="[^?#]*\w+\.(?=html|php)" />

                    <action type="Rewrite" url="{R:0}aspx" logRewrittenUrl="true" />

                </rule>

            </rules>

        </rewrite>

    </system.webServer>

</configuration>

其中,html | php這邊可以加入任何需要轉址的附檔名;設定後,當使用者存取abc.html時,網址列仍然會顯示abc.html,但實際上是由abc.aspx來處理

 

2. 透過URL Rewrite的Redirect轉址

在web.config中加入以下這一段設定

<configuration>

<!--- Ommitted à

<system.webServer>

        <rewrite>

            <rules>

                <rule name="TEST" stopProcessing="true">

                    <match url="[^?#]*\w+\.(?=html|php)" />

                    <action type="Redirect" url="{R:0}aspx" logRewrittenUrl="true"  redirectType="Permanent"/>

                </rule>

            </rules>

        </rewrite>

    </system.webServer>

</configuration>

其中,html | php這邊可以加入任何需要轉址的附檔名;設定後,當使用者存取abc.html時,Server會告訴瀏覽器真正的網址是abc.aspx,然後使用者會被轉到abc.aspx;網址列會顯示abc.aspx。

2014年10月23日

在IIS上設定HTTP轉址為HTTPS

· 開啟IIS Manager

· 在需要做HTTP轉HTTPS的網站上開啟URL Rewrite
clip_image001

· 新增規則

clip_image003

· 建立一個空的規則

clip_image005

· 設定Inbound Rule

clip_image007

· 展開Condition並新增一個規則

clip_image009

· 設定 Condition如下

clip_image010

· 新增一個Action

clip_image012

· 完成後按下Apply

clip_image013

·

2014年10月1日

[Azure]DocumentDB開發

剛剛建了一個DocumentDB來測試看看,下面是一些測試過程的sample code與心得。

DocumentDB的架構如下:

image

首先是建立資料庫與Collection,並將文件加入Collection

    private async void CreateDB()
{
//宣告三個物件
dynamic obj1 = new {
Id = "1",
Name ="Demo1"
};
dynamic obj2 = new {
Id = "2",
Name = "Demo2"
};
dynamic obj3 = new
{
Id = "3",
Name = "Demo3",
DisplayName = "Test display" //測試不同物件型態
};
using (var client = new DocumentClient(new Uri("https://<<your db>>.documents.azure.com:443/"),
"<<your key>>"))
{
var database = new Database
{
Id = "DemoDB"
};
database = await client.CreateDatabaseAsync(database);

var collection = new DocumentCollection { Id = "Demo" };
collection = await client.CreateDocumentCollectionAsync(database.SelfLink, collection);

await client.CreateDocumentAsync(collection.SelfLink, obj1);
await client.CreateDocumentAsync(collection.SelfLink, obj2);
await client.CreateDocumentAsync(collection.SelfLink, obj3);//不同物件型態一樣可以新增成功
}
}



 



接著,查詢剛剛加入的文件



    protected async void Button2_Click(object sender, EventArgs e)
{
using (var client = new DocumentClient(new Uri("https://<<yourdb>>.documents.azure.com:443/"),
"<<your key>>"))
{
var databases = client.CreateDatabaseQuery();
var database = databases.AsEnumerable().Where(x => x.Id == "DemoDB").SingleOrDefault();

var collections = client.CreateDocumentCollectionQuery(database.CollectionsLink);
var collection = collections.AsEnumerable().Where(c => c.Id == "Demo").SingleOrDefault();

var query = client.CreateDocumentQuery(collection.DocumentsLink, "select * from Demo d where d.DisplayName = 'Test display'");
var obj = query.AsEnumerable().ToArray();


await client.DeleteDatabaseAsync(database.SelfLink);
}
}



 



 



測試Stored Procedure



    protected async void Button3_Click(object sender, EventArgs e)
{
StoredProcedure sp = new StoredProcedure()
{
Id = "testSP",
Body = File.ReadAllText(Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase,"sp.txt"))
};
using (var client = new DocumentClient(new Uri("https://<<your db>>.documents.azure.com:443/"),
"<<your key>>"))
{
var databases = client.CreateDatabaseQuery();
var database = databases.AsEnumerable().Where(x => x.Id == "DemoDB").SingleOrDefault();
var collections = client.CreateDocumentCollectionQuery(database.CollectionsLink);
var collection = collections.AsEnumerable().Where(c => c.Id == "Demo").SingleOrDefault();
var sps = client.CreateStoredProcedureQuery(collection.StoredProceduresLink);
if (sps.AsEnumerable().Count() > 0)
{
await client.DeleteStoredProcedureAsync(sps.AsEnumerable().Single().SelfLink);
}
sp = await client.CreateStoredProcedureAsync(collection.SelfLink, sp);
}
}



 



Stored procedure定義如下:



function getTestItem(id1, id2){
var cxt = getContext();
var colleciton = cxt.getCollection();
var response = cxt.getResponse();
colleciton.queryDocuments(colleciton.getSelfLink(),
'Select * from Demo d where d.Id="' + id1 + '" or d.Id="' + id2 + '"'
,function(err, documents){
if(err){
response.setBody(err);
}else{
if(documents.length > 0){
response.setBody(response.getBody() + JSON.stringify(documents));
}
}
}
);

}



 



呼叫此Stored Procedure,檢查result物件可以看到回傳的JSon物件結構。



    protected async void Button4_Click(object sender, EventArgs e)
{
using (var client = new DocumentClient(new Uri("https://<<your db>>.documents.azure.com:443/"),
"<<your key>>"))
{
var databases = client.CreateDatabaseQuery();
var database = databases.AsEnumerable().Where(x => x.Id == "DemoDB").SingleOrDefault();
var collections = client.CreateDocumentCollectionQuery(database.CollectionsLink);
var collection = collections.AsEnumerable().Where(c => c.Id == "Demo").SingleOrDefault();

var sp = client.CreateStoredProcedureQuery(collection.StoredProceduresLink).AsEnumerable().Where(s => s.Id == "testSP").SingleOrDefault();

dynamic result = await client.ExecuteStoredProcedureAsync<dynamic>(sp.SelfLink, "3", "1");

}
}



 



 



 




2014年9月30日

[Azure]在Worker Role中使用管理憑證來管理訂閱或其他服務

在Azure Worker Role中管理其他服務,會需要幾件事:

  • 憑證必須是該訂閱的管理憑證
  • Worker Role必須可以存取到該管理憑證
  • 該憑證(PFX)必須上傳到Worker Role的Cloud Service中
  • Worker Role必須在elevated權限下執行

 

  • 憑證必須是目標訂閱的管理憑證

o 到https://manage.windowsazure.com的設定 -> 管理憑證中確認

clip_image002

  • Worker Role必須可以存取到該管理憑證

o 該憑證必須在VS專案中明確指定;稍後可以在佈署到Cloud Service後在Portal上修改

clip_image004

clip_image006

  • 該憑證(PFX)必須上傳到Worker Role的Cloud Service中

clip_image008

  • Worker Role必須在elevated權限下執行

clip_image010

2014年9月12日

[Azure]為透過Azure AD驗證的網站加上多因素驗證

前提是我已經有一個網站設定為透過Azure AD來做身分驗證,現在我們要為他加上多因素驗證

  • 首先到Azure portal上啟用多因素驗證

image

  • 加完後會像這樣

image

  • 回到剛剛關連到多因素驗證的AD管理介面,切換到使用者,管理多因素驗證

image

  • 這會開一個新視窗帶我們到管理介面,將需要多因素驗證的使用者打勾,然後設定為起用或強制

image

  • 確定啟用

image

這樣就設定完了

  • 然後當使用者登入的時候,就會看到提示需要設定多因素驗證的畫面,點"立即設定"

image

  • 就會看到設定畫面,這邊我先選透過app驗證(需要先到手機上下載Multi-Factor Auth這個App - Windows Phone, Android, and IOS)

image

  • 然後按下設定,會看到這個畫面

image

  • 用手機上的Multi-Factor Auth app掃這個QR Code,就可以完成手機上App與此WAAD多因素驗證的連結
  • 完成之後,每次登入時,手機就會收到驗證要求,在手機上確認登入就可以登入網站了。

Blog Archive

About Me