[ASP.NET] 透過 DNS,跨網站存取 身份/Cookie

[ASP.NET] 透過 DNS,跨網站存取 身份/Cookie

架構:

網域下有兩台電腦分別是WebApp1、WebApp2,裡面有 IIS 跟網站應用程式,還有一台 DNS Server

 

架構圖:

假若你的網站應用程式符合這樣的架構,可透過這樣的架構完成 Single Sign On

image

 

下圖是DNS的管理員畫面

image

 

若要讓這兩個網站共用 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

image

 

把網站丟到Windows Azure,也是得到相同結果

SNAGHTML2abd7b1a

 


 

文章出自: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

Image result for microsoft+mvp+logo