2011年10月21日 星期五

單一簽入(SingleSignOn)的簡單作法_Part2_與我的E政府(自然人憑證為例)

因為專案的要求,與我的E政府進行單簽時,僅就自然人憑證的部分,所以以下用自然人憑證單一登入作為說明:

環境:
1. 程式:asp.net
2. 語法:C#
3. 系統登入機制:使用asp.net提供的帳號管理

準備工作:
1. 資料庫增加一個"asp.net帳號管理"與UserID的Mapping表,以身份證字號為key。
2. 撰寫新增帳號的function(功能:當遇到新使用者,利用Membership.CreateUser新增asp.net帳號,並同步寫入Mapping表)

我的登入流程:
1. 由系統按登入鈕後,轉址至我的E政府網站,並依照E政府規定格式擺上returnurl與level參數(例:https://www.cp.gov.tw/portal/Clogin.aspx?returnurl=導回頁網址&level=2)
2. 使用者輸入正確的Ping碼並驗證成功後,E政府會依照上步驟returnurl參數將網頁轉址回來。(註:returnurl必須與"既有服務檔案表"內填寫的網址相同)
3. 回到導回頁後,利用Request.Params["twGovT1"].ToString()取得token1,並適當地將其記錄下來。

string token1 = Request.Params["twGovT1"] == null ? "" : Request.Params["twGovT1"].ToString();

4. 利用token1向E政府提供之WebService取得身份證字號(服務位置:https://se.cp.gov.tw/SEWebApplication/AAmediator.asmx,服務名稱:ValidateToken1)

public string GetUID(string token1)
{
try
{
tw.gov.cp.se.AAMediator govpc = new tw.gov.cp.se.AAMediator();
string govcpData = govpc.ValidateToken1(token1);
XmlDocument xml = new XmlDocument();
xml.LoadXml(govcpData);
string UID = xml.GetElementsByTagName("UID").Item(0).FirstChild.Value;
return UID;
}
catch
{
return "Error";
}
}

若是環境有proxy設定,請參考:asp.net_有proxy時連接WebService

5. 利用步驟四得到的身份證字號與資料庫內的會員資料比對,找出會員UID。
6. 以該UID登入asp.net的帳號管理。

FormsAuthentication.RedirectFromLoginPage("user01", false);


簡單來說:
1. 由E政府取得身分證字號。
2. 由身分證字號找到Mapping表內的User。
3. 系統幫User登入。

沒有留言:

張貼留言