[程式開發日記] C# RTSP建立驗證請求(Auth Digest Header)

紀錄一下碰到的難題
網路上的方式都零零散散的

這篇主要是紀錄如何建立Auth Header
所以其它的流程不會講述

先引用幾個命名空間

using System.Security.Cryptography;
using System.Text.RegularExpressions;

然後是核心程式碼

//content: RTSP回傳的401回應字串
//_userName,_password: 帳號密碼
//_path: 請求串流的路徑(前後需一致)
private string GenerateAuth(string content)
{
    string realm = Match(content, "(?<=realm=\").{1,}?(?=\")");
    string nonce = Match(content, "(?<=nonce=\").{1,}?(?=\")");
    string ha1 = DoMD5($"{_userName}:{realm}:{_password}");
    string ha2 = DoMD5($"DESCRIBE:{_path}");
    string response = DoMD5($"{ha1}:{nonce}:{ha2}");

    StringBuilder builder = new StringBuilder();
    builder.Append("Authorization: Digest ");
    builder.Append($"username=\"{_userName}\",");
    builder.Append($"algorithm=\"MD5\",");
    builder.Append($"realm=\"{realm}\",");
    builder.Append($"nonce=\"{nonce}\",");
    builder.Append($"uri=\"{_path}\",");
    builder.Append($"response=\"{response}\"");

    return builder.ToString();
}

private string DoMD5(string content)
{
    MD5 crypt = MD5.Create();
    byte[] bytes = crypt.ComputeHash(Encoding.ASCII.GetBytes(content));
    return BitConverter.ToString(bytes).Replace("-", "").ToLower();
}

private string Match(string content, string pattern)
{
    Match match = Regex.Match(content, pattern);
    return match.Value;
}

在傳送DESCRIBE事件時
如果收到401回應
就要將Auth訊息加入Header
所以程式碼有點像是這樣

//判斷是否401
if (message.Contains("RTSP/1.0 401"))
    auth = GenerateAuth(message);

//在下一次的DESCRIBE訊息中加入Header
var describe = new Describe();
describe.AddHeader(auth);
describe.Send();

流程跟Http很像
要將Auth資料加入到Header中

此篇只是範例
可能不適合所有RTSP設備

留言