pdo.net是我開發(fā)中的sso模塊的一部分,它是兼容pdo統(tǒng)一接口的.net實現(xiàn)
簡介
========================================
pdo規(guī)范由動易(powereasy),動網(wǎng)(dvbbs),oblog三方聯(lián)合制訂和維護(hù),其目的在于為不同的WEB應(yīng)用按照統(tǒng)一的規(guī)范開發(fā)用戶通行接口,以便實現(xiàn)不同WEB應(yīng)用之間的用戶數(shù)據(jù)同步。對該規(guī)范感興趣的人可以去http://www./Soft/documents/86.html下載
優(yōu)點
=========================================
每個整合的網(wǎng)站不需要修改自己的邏輯業(yè)務(wù)和數(shù)據(jù)結(jié)構(gòu)
用戶完全獨立存儲,不需要將用戶集中在用一的結(jié)構(gòu)中。
很適合兩個用戶庫結(jié)構(gòu)差異比較大的應(yīng)用整合
還有不同語言 不同數(shù)據(jù)庫的整合也是可以考慮的
原理
=========================================
不同的web應(yīng)用通過把用戶序列化為xml來傳遞用戶對象,利用ServerXmlHttp 進(jìn)行服務(wù)器和服務(wù)器之間的通訊來傳遞數(shù)據(jù)進(jìn)行通訊
using System;
using System.Text;
using System.Xml;
namespace Boxi.Web.SSO
{
/// <summary>
/// 用戶基本屬性實體類
/// </summary>
public class User
{
#region 私有變量
private string _username;
private string _password;
private string _email;
private string _question;
private string _answer;
private string _savecookie;
private string _truename;
private string _gender;
private string _birthday;
private string _qq;
private string _msn;
private string _mobile;
private string _telephone;
private string _province;
private string _city;
private string _address;
private string _zipcode;
private string _homepage;
private string _userip;
private string _jointime;
private string _experience;
private string _ticket;
private string _valuation;
private string _balance;
private string _posts;
private string _userstatus;
private string _signature;
private string _occupation;
private string _interests;
#endregion
#region 封裝屬性
/// <summary>
/// 創(chuàng)建用戶
/// </summary>
/// <param name="username">用戶名</param>
public User(string username)
{
_username = username;
}
/// <summary>
/// 用戶名
/// </summary>
public string username
{
get { return _username; }
set { _username = value; }
}
/// <summary>
/// 用戶密碼
/// </summary>
public string password
{
get { return _password; }
set { _password = value; }
}
/// <summary>
/// 電子郵件
/// </summary>
public string email
{
get { return _email; }
set { _email = value; }
}
/// <summary>
/// 密碼提示問題
/// </summary>
public string question
{
get { return _question; }
set { _question = value; }
}
/// <summary>
/// 密碼提示答案
/// </summary>
public string answer
{
get { return _answer; }
set { _answer = value; }
}
/// <summary>
/// cookies保存時間;0=不記錄(默認(rèn)),1=一周,2=一月,3=一年
/// </summary>
public string savecookie
{
get { return _savecookie; }
set { _savecookie = value; }
}
/// <summary>
/// 真實姓名
/// </summary>
public string truename
{
get { return _truename; }
set { _truename = value; }
}
/// <summary>
/// 性別:0=女,1=男,2=保密
/// </summary>
public string gender
{
get { return _gender; }
set { _gender = value; }
}
/// <summary>
/// 生日
/// </summary>
public string birthday
{
get { return _birthday; }
set { _birthday = value; }
}
/// <summary>
/// QQ號
/// </summary>
public string qq
{
get { return _qq; }
set { _qq = value; }
}
/// <summary>
/// MSN賬號
/// </summary>
public string msn
{
get { return _msn; }
set { _msn = value; }
}
/// <summary>
/// 移動電話
/// </summary>
public string mobile
{
get { return _mobile; }
set { _mobile = value; }
}
/// <summary>
/// 固定電話
/// </summary>
public string telephone
{
get { return _telephone; }
set { _telephone = value; }
}
/// <summary>
/// 省/直轄市
/// </summary>
public string province
{
get { return _province; }
set { _province = value; }
}
/// <summary>
/// 城市/區(qū)/縣
/// </summary>
public string city
{
get { return _city; }
set { _city = value; }
}
/// <summary>
/// 通訊地址
/// </summary>
public string address
{
get { return _address; }
set { _address = value; }
}
/// <summary>
/// 郵政編碼
/// </summary>
public string zipcode
{
get { return _zipcode; }
set { _zipcode = value; }
}
/// <summary>
/// 個人主頁
/// </summary>
public string homepage
{
get { return _homepage; }
set { _homepage = value; }
}
/// <summary>
/// 用戶IP地址
/// </summary>
public string userip
{
get { return _userip; }
set { _userip = value; }
}
/// <summary>
/// 注冊日期
/// </summary>
public string jointime
{
get { return _jointime; }
set { _jointime = value; }
}
/// <summary>
/// 經(jīng)驗值
/// </summary>
public string experience
{
get { return _experience; }
set { _experience = value; }
}
/// <summary>
/// 可消費積分
/// </summary>
public string ticket
{
get { return _ticket; }
set { _ticket = value; }
}
/// <summary>
/// 貢獻(xiàn)值
/// </summary>
public string valuation
{
get { return _valuation; }
set { _valuation = value; }
}
/// <summary>
/// 現(xiàn)金余額
/// </summary>
public string balance
{
get { return _balance; }
set { _balance = value; }
}
/// <summary>
/// 發(fā)表信息數(shù)
/// </summary>
public string posts
{
get { return _posts; }
set { _posts = value; }
}
/// <summary>
/// 用戶狀態(tài):0=正常,1=鎖定,2=屏蔽,3=禁止,4=待驗證
/// </summary>
public string userstatus
{
get { return _userstatus; }
set { _userstatus = value; }
}
/// <summary>
/// 簽名檔
/// </summary>
public string signature
{
get { return _signature; }
set { _signature = value; }
}
/// <summary>
/// 職業(yè)
/// </summary>
public string occupation
{
get { return _occupation; }
set { _occupation = value; }
}
/// <summary>
/// 興趣愛好
/// </summary>
public string interests
{
get { return _interests; }
set { _interests = value; }
}
#endregion
/// <summary>
/// 獲取用戶擴(kuò)展屬性對應(yīng)的xml
/// </summary>
/// <returns></returns>
public string ToXML()
{
StringBuilder sb = new StringBuilder();
組裝xml
return sb.ToString();
}
public void LoadXML(XmlDocument xdoc)
{
XmlNode xbody = xdoc.SelectSingleNode("/root/body[1]");
if (xbody!=null)
{
LoadXml(xbody);
}
else
{
LoadXml(xdoc.SelectSingleNode("/root[1]"));
}
}
public void LoadXml(XmlNode xnod)
{
foreach (XmlNode o in xnod.ChildNodes)
{
switch(o.Name)
{
case "username":
{
_username = o.Value;
}
break;
case "password":
{
_password = o.Value;
}
break;
case "email":
{
_email = o.Value;
}
break;
case "question":
{
_question = o.Value;
}
break;
case "answer":
{
_answer = o.Value;
}
break;
case "gender":
{
_gender = o.Value;
}
break;
case "truename":
{
_truename = o.Value;
}
break;
case "birthday":
{
_birthday = o.Value;
}
break;
case "qq":
{
_qq = o.Value;
}
break;
case "msn":
{
_msn = o.Value;
}
break;
case "mobile":
{
_mobile = o.Value;
}
break;
case "telephone":
{
_telephone = o.Value;
}
break;
case "province":
{
_province = o.Value;
}
break;
case "address":
{
_address = o.Value;
}
break;
case "zipcode":
{
_zipcode = o.Value;
}
break;
case "homepage":
{
_homepage = o.Value;
}
break;
case "userip":
{
_userip = o.Value;
}
break;
case "jointime":
{
_jointime = o.Value;
}
break;
case "experience":
{
_experience = o.Value;
}
break;
case "ticket":
{
_ticket = o.Value;
}
break;
case "valuation":
{
_valuation = o.Value;
}
break;
case "balance":
{
_balance = o.Value;
}
break;
case "posts":
{
_posts = o.Value;
}
break;
case "userstatus":
{
_userstatus = o.Value;
}
break;
case "signature":
{
_signature = o.Value;
}
break;
case "occupation":
{
_occupation = o.Value;
}
break;
case "interests":
{
_interests = o.Value;
}
break;
}
}
}
}
}
我們需要做什么?
=========================================
配置一些參數(shù): 配置通訊需要的令牌和需要同步的網(wǎng)站的信息
實現(xiàn)一個接口: 為了讓其它網(wǎng)站發(fā)送同步信息時更夠用自己的方法去修改自己的用戶數(shù)據(jù)
調(diào)用一些方法: 在注冊 登陸 注銷 更新時調(diào)用Ping方法 向其它需要同步的網(wǎng)站發(fā)送同步請求
配置一些參數(shù)
--------------------------
1、增加一個配置節(jié)
<configSections>
<section name="PDO" type="System.Configuration.NameValueSectionHandler"/>
</configSections>
<PDO>
<!--令牌使用的關(guān)鍵字-->
<add key="key" value="Test"/>
<!--當(dāng)前應(yīng)用的名稱-->
<add key="appid" value="web1" />
<!--每次需要actionPing時需要同步的地址列表,用|分隔-->
<add key="ping" value="http://localhost/WebSite2/PDOPing.aspx"/>
<!--本站使用的action_Prvider-->
<add key="PDOAction_Provider" value="Boxi.Web.SSO.PDO.DefaultPDOAction,Boxi.Web.SSO.PDO"/>
</PDO>2、添加httpHandler用來供其它網(wǎng)站Ping
<httpHandlers>
<add verb="*" path="PDOPing.aspx" type="Boxi.Web.SSO.HttpHandler.PDOPingHttpHandler,Boxi.Web.SSO"/>
</httpHandlers> 實現(xiàn)一個接口
-----------------------
根據(jù)自己的邏輯業(yè)務(wù) 實現(xiàn)自己的方法
public interface IPDOAction
{
bool checkname(string name, string email);
bool reguser(User user);
bool login(User user);
bool update(User user);
bool delete(User user);
User getinfo();
}
調(diào)用一些方法
----------------------
1、在自己的頁面的登陸和注銷中額外發(fā)起一個客戶端http請求
//這部分正在尋找更好的解決方法
//這是為了保證每個站點均操作cookies
2、在注冊、更新、刪除、獲取用戶資料時使用ping中提供的方法
reguser(User user); 注冊用戶
update(User user); 更新用戶
delete(User user);刪除用戶
User getinfo();//獲取用戶信息
protected void Button1_Click(object sender, EventArgs e)
{
string username = TextBox1.Text;
string password = TextBox2.Text;
//先實現(xiàn)自己的用戶注冊




.
//然后再通過ping向其它網(wǎng)站注冊
Boxi.Web.SSO.User _user = new User(TextBox1.Text);
_user.password = TextBox2.Text;
PDOPing _ping=new PDOPing();
string[] result = _ping.reguser(_user);
for (int i = 0; i < result.Length;i++ )
{
//將所有站點注冊的結(jié)果寫到頁面
Response.Write(result[i]);
Response.Write("<br/>");
}
}



