完全用託管程式碼建構的完整 Kerberos 函式庫,沒有(許多)作業系統依賴性。
此計畫由 .NET 基金會支持。
該庫不受 Microsoft 官方支援。如果您透過 Oracle 的 ODP.NET 使用它,則僅透過 Oracle 支援支援 Kerberos.NET。即使您知道問題出在 Kerberos.NET 中,您也必須聯絡 Oracle 支援。如果 Kerberos.NET 中存在問題,Oracle 支援人員將直接與 Microsoft 合作。 Microsoft 將關閉直接與 Microsoft 建立的 Kerberos.NET 支援案例。
總結一下:儘管一些 Microsoft 員工可能正在管理它並為其做出貢獻,但該儲存庫並未得到 Microsoft 的正式支援。他們要么在空閒時間執行此操作,要么部分作為內部使用的工作時間執行此操作,而沒有來自 Microsoft(或 Microsoft 員工)的任何 SLA。僅透過 Oracle 支援支援 ODP.NET 使用 Kerberos.NET。
.NET 內建的程式庫,可讓您操作 Kerberos 訊息。您可以執行客戶端、託管您自己的 KDC,或只是驗證傳入的票證。它的目的是盡可能輕量。
深入探討 Kerberos.NET 的設計值得一讀。
該專案主要是一個庫,但還包括一系列包裝該庫的有用工具,以幫助建立應用程式並解決 Kerberos 問題。
您可以在本頁右側的版本下找到 Fiddler 擴充安裝程式。有關更多信息,請閱讀有關如何安裝和使用它的文章。
Bruce 命令列工具是一個實用程式集合,可讓您與 Kerberos.NET 庫元件進行交互,並可透過dotnet tool install bruce -g
取得。它包括用於票證快取和密鑰表管理等有用的工具。它還包括下面提到的票證解碼器實用程式。該工具或多或少遵循 MIT 和 Heimdal 命令行標準,但有關套件中所有工具的更多信息,請從 Bruce 命令列鍵入help
。
請參閱此部落格文章以了解如何使用該工具。
查看和修改 krb5 設定檔。
解碼 Kerberos/協商票證,如果您知道秘密,則可以選擇解密。
刪除所有票證快取檔案。
對使用者進行身份驗證並請求 TGT,其中包含一系列可用的請求選項。
查看快取中的所有票證,並可選擇要求更多票證。
向目前或提供的使用者的 KDC 發送 AS-REQ“ping”,以取得該使用者的元資料。
查看和操作密鑰表檔案並支援故障排除。
為目前使用者要求票證並以有用的方式格式化詳細資訊。
如果您傳遞/verbose
命令列參數,該工具會公開有用的日誌訊息。
該程式庫將在所有支援的 .NET Standard 2.0 平台上運行,但有一些注意事項。
您可以透過兩種方式使用該程式庫。首先是下載程式碼並在本地建置。第二個更好的選擇是只使用 nuget。
PM> 安裝套件 Kerberos.NET
您可以透過三種方式使用該程式庫。
與其他平台中的客戶端相比,該客戶端故意變得簡單。它功能齊全,支援產生 SPNego 訊息。
var client = new KerberosClient();var kerbCred = new KerberosPasswordCredential("[email protected]", "userP@ssw0rd!");await client.Authenticate(kerbCred);var Ticket = wait client.GetServiceTicket(" .corp.identityintervention.com");var header = "協商" + Convert.ToBase64String(ticket.EncodeGssApi().ToArray());
託管 KDC 稍微複雜一些,因為它需要偵聽特定連接埠。通常您在連接埠 88 上監聽。
var port = 88;var options = new ListenerOptions{ListeningOn = new IPEndPoint(IPAddress.Loopback, port),DefaultRealm = "corp.identityintervention.com".ToUpper(),RealmLocator = realName => new MyRealmService(監聽器= new KdcServiceListener(options);等待監聽器.Start();
偵聽器將等待,直到呼叫(或釋放) listener.Stop()
。
票證身份驗證分兩個階段進行。第一階段透過IKerberosValidator
和KerberosValidator
的預設實作來驗證票證的正確性。第二階段涉及將票證轉換為可用的ClaimsIdentity
(具體為KerberosIdentity : ClaimsIdentity
),這發生在KerberosAuthenticator
中。
最簡單的開始方法是建立一個新的KerberosAuthenticator
並呼叫Authenticate
。如果需要調整轉換的行為,可以透過重寫ConvertTicket(DecryptedData data)
方法來實現。
varauthenticator=newKerberosAuthenticator(newKey? string.IsNullOrWhitespace(name));
請注意,身份驗證器的建構函式參數是KeyTable
。 KeyTable
是用於在其他平台上儲存金鑰的常見格式。您可以使用ktpass
等工具建立的文件,也可以在實例化期間傳遞KerberosKey
,它會產生相同的效果。
nuget 套件通常會隨著核心庫的任何變更而保持最新。
嘿,它有效!只需添加 nuget 包作為參考。
更多資訊
Active Directory 要求存在與傳送令牌的網域相符的身分。此身分可以是 Active Directory 中的任何使用者或電腦對象,但需要正確配置。這意味著它需要一個服務主體名稱 (SPN)。您可以在此處找到有關設定測試使用者的說明。
Active Directory 自 Server 2012 起就支援宣告。 Kerberos.NET 現在原生支援解析 kerberos 票證中的宣告。請參閱《索賠指南》,以了解有關設定的更多資訊。
Kerberos.NET 支援 KeyTable (keytab) 檔案格式,用於傳遞用於解密和驗證 Kerberos 票證的金鑰。 keytab 檔案格式是許多平台用於儲存金鑰的常見格式。您可以使用ktpass
命令列公用程式在 Windows 上產生這些文件,該實用程式是遠端伺服器管理工具 (RSAT) 套件的一部分。您可以透過 PowerShell(或透過新增 Windows 元件對話方塊)將其安裝在伺服器上:
新增 Windows 功能 RSAT
從那裡您可以透過執行以下命令來產生密鑰表檔案:
ktpass /princ HTTP/[email protected] /mapuser IDENTITYINTERserver01$ /pass P@ssw0rd! /out Sample.keytab /crypto all /PTYPE KRB5_NT_SRV_INST /mapop 設定
參數princ
用於指定產生的PrincipalName, mapuser
用於將其對應到Active Directory中的使用者。 crypto
參數指定哪些演算法應產生條目。
本機支援 AES 票證。無需做任何額外的事情!
現在還包括透過 RFC8009 對 SHA256 和 SHA384 的支援。
有關更多信息,請參閱快速裝甲。
目前尚不支援此功能,但已在路線圖中。
您可以新增自己對 DES 等其他演算法的支援(不知道為什麼要這樣做,但是...),您可以將加密類型與實例化新解密器的 Func<> 相關聯。如果您願意,也沒有什麼可以阻止您直接執行此程序。
KerberosRequest.RegisterDecryptor( 加密類型.DES_CBC_MD5, (令牌) => 新的 DESMD5DecryptedData(令牌));
內建重播偵測使用MemoryCache
暫時儲存對票證隨機數雜湊值的引用。當票證過期時,這些引用將被刪除。一旦驗證器序號可用,檢測過程就會在解密後立即發生。
請注意,當應用程式叢集時,內建偵測邏輯無法有效運作,因為快取不是跨機器共享的。內建實作使用記憶體服務,因此不與任何人共用。
您需要建立一個跨電腦共享的緩存,才能在叢集環境中正常運作。透過新的 .NET Core 依賴項注入服務,這已大大簡化。您需要做的就是註冊一個IDistributedCache
實作。您可以在 Microsoft 文件中找到更多相關資訊。
如果您想使用自己的重播檢測,只需實作ITicketReplayValidator
介面並將其傳遞到KerberosValidator
建構函數中。
有樣品!
KerbCrypto 透過 6 種支援的令牌格式運作。
rc4-kerberos-數據
rc4-spnego-數據
aes128-kerberos-數據
aes128-spnego-數據
aes256-kerberos-數據
aes256-spnego-數據
KerbTester 用於測試真實票據並轉儲解析結果的命令列工具。
KerberosMiddlewareEndToEndSample 端對端範例,顯示伺服器如何提示協商以及模擬瀏覽器的回應。
KerberosMiddlewareSample 一個簡單的通過/失敗中間件範例,用於解碼票證(如果存在),但從不提示協商。
KerberosWebSample 一個範例 Web 項目,旨在託管在 IIS 中,提示協商並驗證來自瀏覽器的任何傳入票證。
該專案擁有 MIT 許可證。有關更多詳細信息,請參閱許可證文件。另請參閱通知文件以獲取有關其所依賴的項目許可證的更多資訊。
該庫附帶一個可選實用程式來解碼服務票證。它很容易使用。只需將票證的 Base64 編碼副本複製到左側文字方塊中即可。如果您不提供金鑰,它將解碼未加密的訊息。如果您提供金鑰,它將嘗試解密該訊息。如果票證使用 RC4 加密,則無需提供主機值,但如果使用 AES 加密(以派生鹽),則需要提供主機值。或者,如果您碰巧也有密鑰表文件,您也可以包含該文件。
您可以使用 Bruce 工具和bruce kdecode
來啟動它。
解碼器會將 Kerberos 票證轉換為結構化樹視圖。過程是Kerberos ASN.1 => JSON() => Tree View渲染。下面是中間 JSON,它向您顯示票證中可用的所有資訊。
{ “請求”:{“KrbApReq”:{“ProtocolVersionNumber”:5,“MessageType”:“KRB_AP_REQ”,“ApOptions”:“保留”,“票證”:{“TicketNumber”:5,“領域”:“CORP。 IDENTITYINTERVENTION.COM","SName": { "FullyQualifiedName": "desktop-h71o9uu", "IsServiceName": false, "類型": "NT_PRINCIPAL", "名稱": ["desktop-h71o9uu" ]},"EncryptedPart" : { "EType": "AES256_CTS_HMAC_SHA1_96", "KeyVersionNumber": 3, "Cipher": "Vo4uodU2...snip...XBwjmsshgyjs+Vr+A=="} }, "驗證器": {"EType" : " AES256_CTS_HMAC_SHA1_96","KeyVersionNumber": null,"Cipher": "NnLmEFkmO3HXCS...snip...up0YmNW5AicQVvvk" }},"KrbApRep": null }, “解密”:{“選項”:“保留”,“EType”:“AES256_CTS_HMAC_SHA1_96”,“SName”:{“FullyQualifiedName”:“desktop-h71o9uu”,“IsServiceName”:false,“類型”:“NT_PRINCIPAL”, “名稱”:[“desktop-h71o9uu”]},“身份驗證器”:{“AuthenticatorVersionNumber”:5,“領域”:“CORP.IDENTITYINTERVENTION.COM”,“CName”:{“FullyQualifiedName”:“jack” ," IsServiceName": false,"類型": "NT_PRINCIPAL","名稱": [ "jack"] }, "校驗和": {"類型": "32771","校驗和": "EAAAAAAAAAAAAAAAAAAAAAAAAA8QAAA" }, "CuSec": 305, "CTime": "2021-04-21T17:38:11+00:00", "子金鑰": {"用途": "未知","EType": "AES256_CTS_HMAC_SHA1_96" ,"KeyValue": "nPIQrMQu/ tpUV3dmeIJYjdUCnpg0sVDjFGHt8EK94EM=" }, "SequenceNumber": 404160760, "AuthorizationData": [{ "Type": "AdIfRelevant", "Data": "MIHTMD+gBAICAI2hNwQ1M...snip...BJAE8ATgAuAEMATwBNAA= ="} ]},"票證": { "Flags": ["EncryptedPreAuthentication","PreAuthenticated","可更新","可轉寄" ], "Key": {"用途": "未知","EType ": "AES256_CTS_HMAC_SHA1_96","KeyValue": "gXZ5AIsNAdQSo/qdEzkfw3RrLhhypyuG+YcZwqdX9mk=" }, "CRealm": "CORP.IDENTITYINTERVENTION.ified, "GullyName" ,"Type": "NT_PRINCIPAL","名稱": [ "jack"] }, "傳輸": {"型別": "DomainX500Compress","內容": "" }, "AuthTime": "2021-04- 21T17:24:53+00:00" ,「開始時間」:「2021-04-21T17:38:11 + 00:00」,「結束時間」:「2021-04-22T03:24:53 + 00: 00”,“續訂”:“2021-04- 28T17:24:53+00:00", "CAddr": null, "AuthorizationData": [{ "Type": "AdIfRelevant", "Data": "MIIDIjCCAx6gBAICAIChg ...snip...muoGI9Mcg0="},{ “類型”:“AdIfRelevant”,“數據”:“MF0wP6AEAgIAj...snip...AXg9hCAgAACTDBBAAAAAA=”} ]},“DelegationTicket”:null,“SessionKey” :{“用法”:null,“EncryptionType”:“ AES256_CTS_HMAC_SHA1_96”,“主機”:null,“PrincipalName”:null,“版本”:null,“Salt”:“”,“密碼”:null,“IterationParameter” :“”,“PasswordBytes”:“”,“SaltFormat ": "ActiveDirectoryService", "RequiresDerivation": false},"傾斜": "00:05:00" }, “計算”:{“名稱”:“[email protected]”,“限制”:{“KerbAuthDataTokenRestrictions”:[{“RestrictionType”:0,“限制”:{“標誌”:“完整”,“ TokenIntegrityLevel": "高","MachineId": "Txr82+sI2kbFmPnkrjldLUfESt/oJzLaWWNqCkOgC7I=" }, "類型": "KerbAuthDataTokenRestrictions"},{ "Restriction": "KerbAuthDataTokenRestrictions"},{ "Restriction" "TokenIntegrityLevel": "高","MachineId": "Txr82+sI2kbFmPnkrjldLUfESt/oJzLaWWNqCkOgC7I=" }, "型別": "KerbAuthDataTokenRestrictions"} ]AAAAKerm="Ap." ": "KerbLocal"},{ "Value": "EBeD2EICAAAJMMEEAAAAAA==", "Type": "KerbLocal"} ], "KerbApOptions": [{ "Options": "ChannelBindingSupported", "Type": "KerbApOptions"} ], "KerbServiceTarget": [{ "ServiceName": "[email protected]", "Type": "KerbServiceTarget"} ], "AdWin2kPac": [{ "Mode": "Server", "DecodingErrors ": [], "版本": 0, "登入資訊": {"PacType": "LOGON_INFO","登入時間": "2021-04-21T17:24:53.4021307+00:00","登出時間" : "0001 -01-01T00:00:00+00:00","KickOffTime": "0001-01-01T00:00:00+00:00","PwdLastChangeTime": "2021-00+00:00","PwdLastChangeTime": "2021-001-1423 39.0024458+00 :00","PwdCanChangeTime": "2021-01-15T23:55:39.0024458+00:00","PwdMustChangeTime": "0001-01-01T00","PwdMustChangeTime": "0001-01-01T000+ ": "jack ”,“UserDisplayName”:“Jack Handey”,“LogonScript”:“”,“ProfilePath”:“”,“HomeDirectory”:“”,“HomeDrive”:“”,“LogonCount”:99,“ BadPasswordCount」:0 ,"UserId": 1126,"GroupId": 513,"GroupCount": 6,"GroupIds": [ {"RelativeId": 1132,"屬性": [ "SE_GROLEDUP_MANDATORY", "SEV_UP_DEENABEN」 "] }, {“RelativeId”:1131,“屬性”:[“SE_GROUP_MANDATORY”,“SE_GROUP_ENABLED_BY_DEFAULT”,“SE_GROUP_ENABLED”]},{“RelativeId”:1128,“屬性”:[“SE_ABLED”]},{“RelativeId”:1128,“屬性”:[“SE_GRO_303L” 「SE _GROUP_ENABLED"] }, {"RelativeId": 1130,"屬性": [ "SE_GROUP_MANDATORY", "SE_GROUP_ENABLED_BY_DEFAULT", "SE_GROUP_ENABLED"] }, {"Relative, N.Lelative SE_GROUP_ENABLED "] }, {"RelativeId": 1129,"屬性": [ "SE_GROUP_MANDATORY", "SE_GROUP_ENABLED_BY_DEFAULT", "SE_GROUP_ENABLED"] }],"UserFlaAAAAAAAAADS,="AAAAAAANosA, NEX " ServerName": "DC01u0000","DomainName": "CORPu0000","DomainId": "S-1-5-21-311626132-1109945507-1757856464","ReservAAAed: " ADS_UF_LOCKOUT", "ADS_UF_NORMAL_ACCOUNT"],"SubAuthStatus": 0,"LastSuccessfulILogon": "1601-01-01T00:00:00+00:00","LastFailedILogon":016+ 00 :00","FailedILogonCount": 0,"Reserved3": 0,"ExtraSidCount": 1,"ExtraIds": [ {"Sid": "S-1-18-1","屬性": [ "SE_GROUP_MANDATORY " , "SE_GROUP_ENABLED_BY_DEFAULT", "SE_GROUP_ENABLED"] }],"ResourceDomainId": null,"ResourceGroupCount": 0,"ResourceGroupIds": null,"UserSid": { "Id": 屬性" "值”:“S-1-5-21-311626132-1109945507-1757856464-1126”},“GroupSid”:{“Id”:513,“屬性”:“0”,“值”:“S-1 - 5-21-311626132-1109945507-1757856464-513"},"GroupSids":[ {"Id":1132,"屬性":["SE_GROLEDUP_MANDATORY","Id":1132,"屬性":["SE_GROLEDUP_MANDATORY","SE_GRO_DENABSV43_UENAB," S -1-5-21-311626132-1109945507-1757856464-1132" }, {"Id": 1131,"屬性": [ "SE_GROUP_MANDATORY", "SE_GROUP_ENAB 值": [ "SE_GROUP_MANDATORY", "SE_GROUP_ENAB." 1 -5-21-311626132-1109945507-1757856464-1131" }, {"Id": 1128,"屬性": [ "SE_GROUP_MANDATORY", "SE_GROUP_ENABUL": [ "SE_GROUP_MANDATORY", "SE_GROUP_ENABUL"_DESE_GROUP_MANDATORY", "SE_GROUP_ENABUL"_DEDESE_GROO." 5 -21-311626132-1109945507-1757856464-1128" }, {"Id": 1130,"屬性": [ "SE_GROUP_MANDATORY", "SE_GROUP_ENABAB_BY_DULT.T." 21 -311626132-1109945507-1757856464-1130" }, {"Id": 513,"屬性": [ "SE_GROUP_MANDATORY", "SE_GROUP_ENABLED_BY_DEFAULT"," 311626 132 -1109945507-1757856464-513" }, {"Id": 1129,"屬性": [ "SE_GROUP_MANDATORY", "SE_GROUP_ENAB_BY_DEFAULT", "SE_ROLED 2 -110994 5507 -1757856464-1129" }],"ExtraSids": [ {"Id": 1,"屬性": "0","值": "S-1-18-1" }],"ResourceDomainSid" : null, “ResourceGroups”:[],“DomainSid”:{“Id”:1757856464,“屬性”:“0”,“值”:“S-1-5-21-311626132-1109945507-1757856464” ,“ServerSignature “:{“類型”:“HMAC_SHA1_96_AES256”,“簽名”:“Q0gnRmxBoh5w0DzS”,“RODCIdentifier”:0,“PacType”:“0”},“CredentialType”:null,“Kdcatureature.” 」:「 HMAC_SHA1_96_AES256","簽名": "HVsreq5rqBiPTHIN","RODCIdentifier": 0,"PacType": "0" }, "ClientClaims": null, "DeviceClaims": null, "ClientInformation" "2021- 04-21T17:24:53+00:00","姓名": "jack","PacType": "CLIENT_NAME_TICKET_INFO" }, "UpnDomainInformation": {"Upn": "@corp.identityintervention.com ","域”:“CORP.IDENTITYINTERVENTION.COM”,“標誌”:“0”,“PacType”:“UPN_DOMAIN_INFO”},“DelegationInformation”:null,“HasRequiredFields”:true,“類型”:“AdWin2kPac” }]} ,"ValidationMode": "Pac","Claims": [ {"Type": "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/sid","Value": "S- 1-5-21-311626132-1109945507-1757856464-1126" }, {"類型": "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname","值": " Jack Handey" }, {"類型": "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier","值": "[email protected]" }, { “類型”:“http://schemas.microsoft.com/ws/2008/06/identity/claims/groupsid”,“值”:“S-1-5-21-311626132-1109945507-1757856464- 1132”} ,{“類型”:“http://schemas.microsoft.com/ws/2008/06/identity/claims/groupsid”,“值”:“S-1-5-21-311626132-1109945507- 1757856464-1131 ” },{“類型”:“http://schemas.microsoft.com/ws/2008/06/identity/claims/groupsid”,“值”:“S-1-5-21-311626132- 1109945507-1757856464 -1128" }, {"類型": "http://schemas.microsoft.com/ws/2008/06/identity/claims/groupsid","值": "S-1-5-21- 311626132-1109945507 -1757856464-1130" }, {"類型": "http://schemas.microsoft.com/ws/2008/06/identity/claims/groupsid","值": "S-1-5- 21-311626132 -1109945507-1757856464-513" }, {"類型": "http://schemas.microsoft.com/ws/2008/06/identity/claims/role","值": "網域使用者" } , {"類型」:“http://schemas.microsoft.com/ws/2008/06/identity/claims/groupsid”,“值”:“S-1-5-21-311626132-1109945507-1757856464-1129 ”}, {“類型”:“http://schemas.microsoft.com/ws/2008/06/identity/claims/groupsid”,“值”:“S-1-18-1”}] }, “KeyTable”:{“FileVersion”:2,“KerberosVersion”:5,“條目”:[ {“EncryptionType”:“NULL”,“長度”:0,“時間戳”:“2021-04-21T23:52 : 22.5460123+00:00","版本": 5,"主機": null,"PasswordBytes": "jBBI1KL19X3olbCK/f9p/+cxZi3RnqqQRH4WawB4ErinY=","Key:Pci:Name" , “名稱”:[“STEVE-HOME”],“NameType”:“NT_SRV_HST”,“FullyQualifiedName”:“STEVE-HOME”},“鹽”:null }] }}