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

C# Web Service 以 Session 實現非 SOAP Header 身分驗證

     編輯:關於C#

背景與動機

傳統 ASMX Web Service 常透過 SOAP Header 傳遞驗證資訊,但非 .NET 客戶端 (Java, PHP, Python) 處理 SOAP Header 較為繁瑣。利用 ASP.NET 內建 Session 機制,配合 [WebMethod(EnableSession = true)],可實現類似網站登入的狀態驗證:先呼叫登入方法建立 Session,後續方法檢查 Session 狀態即可。

核心實作

using System.Web.Services;

public class ArchiveService : WebService {
    /// 
    /// 授權驗證,建立 Session
    /// 
    [WebMethod(EnableSession = true, MessageName = "授權驗證")]
    public bool CheckAuthorize(string appName, string appAuthorizeCode) {
        bool authorized = (appName == "帳號名稱" && appAuthorizeCode == "123456");
        Session["Login"] = authorized;
        return authorized;
    }

    /// 
    /// 業務方法,需先通過驗證
    /// 
    [WebMethod(EnableSession = true, MessageName = "添加檔案")]
    public string AddArchive(Archives model) {
        try {
            if (Session["Login"] != null && (bool)Session["Login"]) {
                var bll = new BLL.Archives();
                return bll.AddArchive(model) ? "檔案添加成功" : "檔案添加失敗";
            }
            return "未通過驗證";
        } catch (Exception ex) {
            return ex.Message;
        }
    }
}

客戶端呼叫流程

  1. 呼叫 CheckAuthorize("帳號名稱", "123456"),取得回傳 true 並自動接收 Set-Cookie: ASP.NET_SessionId=...。
  2. 後續所有請求攜帶該 Cookie (大多數 HTTP Client 自動處理)。
  3. 伺服端 AddArchive 讀取 Session["Login"] 判斷權限。
  4. Session 逾時 (預設 20 分鐘) 後自動失效,需重新驗證。

關鍵點總結

  • EnableSession = true:啟用 Session 狀態,否則 Session 為 null。
  • Cookie 管理:客戶端必須支援 Cookie 容器 (CookieContainer) 維持 Session。
  • 無狀態替代:RESTful API 建議改用 Token (JWT/API Key) 而非 Session,避免伺服端狀態擴展性問題。
  • 安全性:生產環境請使用 HTTPS、強密碼雜湊、防暴力破解、Session 固定攻擊防護。

完整程式碼 (含重複區段已去除)

/// 
/// 授權驗證,在調用Web Service的時候先調用這個方法,
/// 調用完成後就像普通網站登錄一樣,只要Session不超時就不需要再次調用此方法了
/// 
[WebMethod(EnableSession = true, MessageName = "授權驗證")]
public bool CheckAuthorize(string appName, string appAuthorizeCode) {
    if (appName == "帳號名稱" && appAuthorizeCode == "123456")
        Session["Login"] = true;
    else
        Session["Login"] = false;
    return (bool)Session["Login"];
}

/// 
/// 添加檔案,然後再調用
/// 
[WebMethod(EnableSession = true, MessageName = "添加檔案")]
public string AddArchive(Model.Archives model) {
    try {
        if (Session["Login"] != null && Session["Login"].Equals(true)) {
            BLL.Archives bll = new BLL.Archives();
            if (bll.AddArchive(model))
                return "檔案添加成功";
            else
                return "檔案添加失敗";
        } else
            return "未通過驗證";
    } catch (Exception err) {
        return err.Message;
    }
}

注意:原文程式碼有重複定義,此處已去重整理

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