[程式開發日記] 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設備
留言