1. 程式人生 > >SSO-C#跨域單點登入(一)

SSO-C#跨域單點登入(一)

開篇就是定義Model,資料為先:

 public class Something
    {
        public const string CookieName = "User";

        public const double TimeOut = 1;
    }
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() { }
    }
接著建立一個名為Passport的webservice專案:
 /// <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;
        }
    }
新建一個名為LogIn的空Web應用程式,引用上面建的web服務:

新建一個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);
        }
 
    }