SSO-C#跨域單點登入(一)
阿新 • • 發佈:2019-01-04
開篇就是定義Model,資料為先:
public class Something
{
public const string CookieName = "User";
public const double TimeOut = 1;
}
接著建立一個名為Passport的webservice專案:public class User { public string UserName { get; set; } public string Password { get; set; } public User(string userName,string password) { this.UserName = userName; this.Password = password; } public User() { } }
新建一個名為LogIn的空Web應用程式,引用上面建的web服務:/// <summary> /// WebService1 的摘要說明 /// </summary> [WebService(Namespace = "http://passport.maikegroup.com")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.ComponentModel.ToolboxItem(false)] // 若要允許使用 ASP.NET AJAX 從指令碼中呼叫此 Web 服務,請取消註釋以下行。 // [System.Web.Script.Services.ScriptService] public class WebService1 : WebService { [WebMethod] public string TokenGetCredence(string tokenValue) { return CacheManager.GetCacheValue(tokenValue); } [WebMethod] public string CheckUser(string userName, string password) { if (CheckUserLogIn(userName, password)) { string token = CreateToken(); Common.User user = new Common.User(userName, password); string json = Newtonsoft.Json.JsonConvert.SerializeObject(user); CacheManager.CacheInsert(token, json); return token; } return string.Empty; } private string CreateToken() { return Guid.NewGuid().ToString(); } private bool CheckUserLogIn(string userName, string password) { if ((userName.Equals("1") && password.Equals("1")) || (userName.Equals("2") && password.Equals("2"))) return true; return false; } } public static class CacheManager { public static void CacheInsert(string key, object value) { //Insert存在相同的鍵會替換,無返回值 //Add 存在相同的鍵會異常,返回快取成功的物件 //Cache的過期策略使用滑動過期 HttpRuntime.Cache.Insert(key, value, null, DateTime.MaxValue, TimeSpan.FromMinutes(Common.Something.TimeOut)); } public static string GetCacheValue(string key) { if (HttpRuntime.Cache[key] != null) { return HttpRuntime.Cache[key].ToString(); } return string.Empty; } }
新建一個default.aspx頁面:
介面如下:
public partial class _default : System.Web.UI.Page { private string backUrl = string.Empty; public string BackUrl { get { return backUrl; } set { backUrl = value; } } protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { if (Request.QueryString["backurl"] != null) { BackUrl = Request.QueryString["backurl"]; } } } protected void btnLogin_Click(object sender, EventArgs e) { if (string.IsNullOrEmpty(TextBox1.Text.Trim()) || string.IsNullOrEmpty(TextBox2.Text.Trim())) return; UserWS.WebService1SoapClient webservice = new UserWS.WebService1SoapClient(); string token = webservice.CheckUser(TextBox1.Text.Trim(), TextBox2.Text.Trim()); if (!string.IsNullOrEmpty(token)) { CreateCookie(token); if (!string.IsNullOrEmpty(backUrl)) { Response.Redirect(backUrl); } else { Response.Redirect("main.aspx"); } } else { Page.ClientScript.RegisterClientScriptBlock(typeof(string), "alert", "賬號密碼不正確"); } } protected void btnReset_Click(object sender, EventArgs e) { TextBox1.Text = string.Empty; TextBox2.Text = string.Empty; } private void CreateCookie(string value) { HttpCookie tokenCookie = new HttpCookie(Common.Something.CookieName, value) { Domain = "localhost", Path = "/", Expires = DateTime.Now.AddMinutes(Common.Something.TimeOut) }; Response.Cookies.Add(tokenCookie); } }