MOSS2007 如何實作SSO項目總結
單點登陸目前以下幾種情況:
1 如果MOSS2007采用AD認證,可以使用MOSS自帶的SSO,分别把使用者資訊(使用者名和密碼)采用POST方式傳遞給各個應用系統(如:OA系統,郵件系統等);
2 如果MOSS2007采用Form認證,可以使用MOSS自帶的SSO,分别把使用者資訊(使用者名和密碼)采用POST方式傳遞給各個應用系統(如:OA系統,郵件系統等);
3 如果公司有自己的使用者管理系統,而又擁有單獨的SSO系統,需求是實作各個應用系統(如OA,郵件)與MOSS雙向實作單點登陸;
現在介紹實作思路如下:
(1)開發自定義Membership 和 RoleProvider
MembershipProvider必需實作的接口為:
System.Web.Security.MembershipProvider.GetUser
System.Web.Security.MembershipProvider.GetUserNameByEmail(System.String)
System.Web.Security.MembershipProvider.ValidateUser(System.String,System.String)
System.Web.Security.MembershipProvider.FindUsersByEmail(System.String,System.Int32,System.Int32,System.Int32)
System.Web.Security.MembershipProvider.FindUsersByName(System.String,System.Int32,System.Int32,System.Int32)
RoleProvider必需實作的接口為:
System.Web.Security.RoleProvider.GetRolesForUser(System.String)
System.Web.Security.RoleProvider.RoleExists(System.String)
(2)入口為SSO,開發自定義WebPart,核心代碼如下:
//如果使用者登陸,則顯示使用者登陸資訊,已經各個應用系統的入口位址
if (this.Context.User.Identity.IsAuthenticated == true)
{
//this.LoginPanel.Visible = false;
this.WelcomeLabel.Text = SPContext.Current.Web.CurrentUser.Name.ToString();
this.WelcomePanel.Visible = true;
}
else
{
//統一入口為SSO
//如果使用者沒有登陸,則跳轉到SSO的登陸頁面,如果登陸成功,則由SSO自動重定向MOSS站點首頁
//在這個過程中,使用者的資訊已經由SSO成功記錄,這時其它應用系統就能共享這些資訊,實作與MOSS雙向單點登陸
SSOClient.SSOClientBusiness ssoClient = new SSOClient.SSOClientBusiness();
Dictionary<string, string> userInfo = ssoClient.Login(null, this.Page);
//擷取帳戶名
MembershipUser muser = Membership.GetUser((object)userInfo["UniqueID"], false);
//用帳戶名登陸MOSS
FormsAuthentication.RedirectFromLoginPage(muser.UserName, false);
Response.Redirect(Request.Url.ToString());
}
(3)入口為MOSS,開發自定義WebPart,核心代碼如下:
protected void Page_Load(object sender, EventArgs e)
{
if (this.Context.User.Identity.IsAuthenticated == true)
{
this.LoginPanel.Visible = false;
this.WelcomeLabel.Text = SPContext.Current.Web.CurrentUser.Name.ToString();
this.WelcomePanel.Visible = true;
}
else
{
this.LoginPanel.Visible = true;
this.WelcomePanel.Visible = false;
}
}
protected void loginSubmit_Click(object sender, EventArgs e)
{
string userID = this.loginUserId.Text;
string password = this.loginUserPwd.Text;
if (Membership.ValidateUser(userID, password))
{
//在這裡采用跨越Cookie,以達到MOSS與應用系統的雙向單點登陸,
// 這個沒能最終實作,如果有高手已經實作,請共享出來
//用帳戶名登陸MOSS
FormsAuthentication.RedirectFromLoginPage(userID, this.RememberMe.Checked);
Response.Redirect(Request.Url.ToString());
}
else
{
this.lblTipMsg.Text = "使用者名或密碼不正确,請重新登陸!";
}
}
}