首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> 關於ASP.NET

ASP.NET Forms 認證跨子域名單點登入(SSO)實作與潛在缺陷分析

     編輯:關於ASP.NET

利用 ASP.NET Forms Authentication 實現同主域下不同子域名共享登入狀態(如 a.example.com、b.example.com),需完成三項關鍵設定:

Web.config 設定

<authentication mode="Forms">
  <forms name=".ASPNETFORM" domain=".example.com" loginUrl="/login.aspx"
         defaultUrl="/default.aspx" protection="All" timeout="30" path="/"
         requireSSL="false" slidingExpiration="true"
         enableCrossAppRedirects="false" cookieless="UseDeviceProfile" />
</authentication>

<machineKey validationKey="..." decryptionKey="..." validation="SHA1" />
  • domain=".example.com":Cookie 作用域涵蓋所有子域名。
  • machineKey:所有應用程式必須使用相同金鑰,確保票據加解密一致性。可用線上工具產生。

登入建立票據

var ticket = new FormsAuthenticationTicket(1, userName, DateTime.Now,
    DateTime.Now.AddDays(1), false, Request.UserHostAddress);
string encryptedTicket = FormsAuthentication.Encrypt(ticket);
var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket)
{
    Domain = ConfigurationManager.AppSettings["SSODomain"] // 如 ".example.com"
};
Response.Cookies.Add(cookie);

常見缺陷與風險

  1. Cookie 污染:子域名間 Cookie 互相可讀,若某子站有 XSS 漏洞,攻擊者可竊取 SSO Cookie 存取所有子系統。
  2. 登出同步困難:需在所有子域名清除 Cookie,實作複雜且易遺漏。
  3. 機器金鑰洩漏:machineKey 一旦外洩,所有系統票據可被偽造。
  4. 不支援跨主域:僅限同一根域名下運作。

建議:評估風險後採用,或改用 OAuth/OpenID Connect 等現代 SSO 協定。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved