[ASP.NET] 透過 DNS,跨網站存取 身份/Cookie
架構:
網域下有兩台電腦分別是WebApp1、WebApp2,裡面有 IIS 跟網站應用程式,還有一台 DNS Server
架構圖:
假若你的網站應用程式符合這樣的架構,可透過這樣的架構完成 Single Sign On
下圖是DNS的管理員畫面
若要讓這兩個網站共用 Authentication Cookie 需要兩個步驟:
1.設定相同的machinekey
machinekey 的產生方法可以參考以下
http://www.codeproject.com/Articles/27576/Single-Sign-on-in-ASP-NET-and-Other-Platforms
金鑰請調成你自己的
validationKey="395BB0DAFA02BA520EDB43E7EDF06BBFD72FC13A5209243270539E01074B0EA4" decryptionKey="037D2C9D97979D8D810F4A6A2B9337BD181F32167735F2E0" validation="SHA1"> </machineKey>
PS.web.config 的 machineky 是票証的加解密金鑰
http://support.microsoft.com/kb/910443/zh-tw
2.設定<forms domain>
domain 請調成你自己的
<forms domain="demo.local"> </forms> </authentication>
然後加入一些測試程式碼測試是否可行
@Login.aspx.cs
Page_Load:若已通過身份驗証則導回原本請求的那一頁Button_Login_Click:跳過驗証機制,直接寫入驗証cookie
{ protected void Page_Load(object sender, EventArgs e) { if (IsPostBack) { return; } if (User.Identity.IsAuthenticated) { this.Response.Redirect(FormsAuthentication.GetRedirectUrl(User.Identity.Name, false)); } } protected void Button_Login_Click(object sender, EventArgs e) { //TODO:驗証帳號密碼 FormsAuthentication.SetAuthCookie(this.TextBox_UserName.Text, false); this.Response.Redirect(FormsAuthentication.GetRedirectUrl(this.TextBox_UserName.Text, false)); } }
@default.aspx.cs
Page_Load:把驗証cookie讀出來
Button_Logout_Click:登出並導回登入頁
{ if (IsPostBack) { return; } HttpCookie cookie = this.Request.Cookies[FormsAuthentication.FormsCookieName]; this.Response.Write(string.Format("歡迎來到首頁:{0}<br/>", User.Identity.Name)); if (cookie != null) { Response.Write(string.Format("Ticket:{0}<br/>", cookie.Value)); //Response.Write(string.Format("Token:{0}<br/>", FormsAuthentication.Decrypt(cookie.Value).UserData)); Response.Write(string.Format("CookieDomain:{0}<br/>", FormsAuthentication.CookieDomain)); Response.Write(string.Format("CookieMode:{0}<br/>", FormsAuthentication.CookieMode)); } } protected void Button_Logout_Click(object sender, EventArgs e) { FormsAuthentication.SignOut(); //this.Response.Redirect(FormsAuthentication.LoginUrl); FormsAuthentication.RedirectToLoginPage(); }
最後,我將一份程式碼發佈到兩個網站應用程式
測試結果:
兩個不同的網站共用身份 cookie
把網站丟到Windows Azure,也是得到相同結果
文章出自:http://www.dotblogs.com.tw/yc421206/archive/2013/12/25/136160.aspx
範例下載:https://dotblogsfile.blob.core.windows.net/user/yc421206/1312/2013122521012881.zip
若有謬誤,煩請告知,新手發帖請多包涵
Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET