代碼分析 從上面的流程中我們可以看出
系統中Shop和Office的代碼是完全類似的
只要Shop可以實現
Office也可以同樣的克隆
所以我們的重點分析的對象是Shop和Service的代碼
Shop的Web
config和Project
cs
在Shop的Web
config裡
我們配置了Service站點和Shop站點
以方便我們在部署時方便修改
<appsettings>
<add key=
Service
value=
http://localhost:
/>
<add key=
WebSite
value=
http://localhost:
/>
</appsettings>
在Project類裡進行引用
using System;
using System
Configuration;
namespace Amethysture
SSO
Shop
{
public class Project
{
public static string Service = ConfigurationSettings
AppSettings[
Service
];
public static string WebSite = ConfigurationSettings
AppSettings[
WebSite
];
}
}
Shop的Global
cs
Shop的Global
cs定義了四個Session變量
UserID用來標識用戶身份
Pass標識用戶即時狀態
Security用於保存往來Service和Shop的通訊不是被仿冒的
Url保存了上次請求的頁面
以保證在用戶登錄後能轉到用戶請求的頁面
protected void Session_Start(Object sender
EventArgs e)
{
this
Session
Add(
UserID
);
this
Session
Add(
Pass
false);
this
Session
Add(
Security
);
this
Session
Add(
Url
);
}
Shop的Any
cs
Shop的Any
cs並沒有包含代碼
因為Any類從Page繼承而來
為了代碼分析方便
我們將代碼集中到Page
cs中
using System;
using System
Web;
namespace Amethysture
SSO
Shop
{
public class Any : Amethysture
SSO
Shop
Page
{
}
}
Shop的Page
cs
Page類有兩個方法
CustomerValidate和Initialize
CustomerValidate用戶檢查用戶的即時狀態
而Initialize是頁面登錄後發送給用戶的信息
我們的重點是CustomerValidate
CustomerValidate是一個非常簡單的流程
用條件語句檢查Pass的狀態
如果Pass為否
則表示用戶沒有登錄
頁面跳轉到Service的Validate頁面中
我們要分析的是其中保存的Url和遞交的WebSite和Security幾個參數
Url的作用在前面已經講清楚了
只是為了保證用戶登錄後能回到原來的頁面
而WebSite是為了保證該站點是被Service所接受的
並且保證Service知道是哪個站點請求了用戶即時狀態
因為這個例子是個簡單的例子
在後面的Validate裡沒有驗證WebSite是否是接受的請求站點
但是在實際應用中應該驗證這一點
因為Shop和Service等同於服務器和客戶端
服務器出於安全考慮必須要檢查客戶端是否是被允許的
Security是非常重要的一點
Shop對Service發送的是請求
不需要保證該請求沒有被篡改
但是在Service應答Shop請求時就必須要保證應答的數據沒有被篡改了
Security正是為了保證數據安全而設計的
[] [] [] [] []
From:http://tw.wingwit.com/Article/program/net/201311/14961.html