Une bibliothèque Kerberos complète entièrement construite en code managé sans (nombreuses) dépendances du système d'exploitation.
Ce projet est soutenu par la .NET Foundation.
Cette bibliothèque n'est PAS officiellement prise en charge par Microsoft. Si vous l'utilisez via ODP.NET d'Oracle, Kerberos.NET est pris en charge uniquement via le support Oracle. Vous devez contacter le support Oracle, même si vous savez que le problème concerne Kerberos.NET. Le support Oracle travaillera directement avec Microsoft si le problème existe dans Kerberos.NET. Microsoft clôturera les dossiers de support créés directement avec Microsoft pour Kerberos.NET.
Pour résumer : ce dépôt n'est PAS officiellement pris en charge par Microsoft, malgré le fait que certains employés de Microsoft puissent le gérer et y contribuer. Ils le font soit pendant leur temps libre, soit partiellement comme temps de travail pour un usage interne, sans aucun SLA de la part de Microsoft (ou des employés de Microsoft). L'utilisation ODP.NET de Kerberos.NET est prise en charge uniquement via le support Oracle.
Une bibliothèque intégrée à .NET qui vous permet d'opérer sur les messages Kerberos. Vous pouvez exécuter un client, héberger votre propre KDC ou simplement valider les tickets entrants. Il est destiné à être aussi léger que possible.
Une analyse approfondie de la conception de Kerberos.NET est disponible et mérite d'être lue.
Ce projet est avant tout une bibliothèque, mais comprend également un ensemble d'outils utiles encapsulant la bibliothèque pour aider à créer des applications et à résoudre les problèmes de Kerberos.
Vous pouvez trouver le programme d'installation de l'extension Fiddler sous les versions sur le côté droit de cette page. Pour plus d’informations, lisez un article sur la façon de l’installer et de l’utiliser.
L'outil de ligne de commande Bruce est une collection d'utilitaires qui vous permettent d'interagir avec les composants de la bibliothèque Kerberos.NET et est disponible via dotnet tool install bruce -g
. Il comprend des outils utiles pour des choses comme le cache des tickets et la gestion des keytabs. Il comprend également l'utilitaire Ticket Decoder mentionné ci-dessous. L'outil suit plus ou moins les normes de ligne de commande du MIT et Heimdal, mais pour plus d'informations sur tous les outils de la suite, help
de la ligne de commande Bruce.
Consultez cet article de blog pour savoir comment utiliser l'outil.
Afficher et modifier les fichiers de configuration krb5.
Décodez les tickets Kerberos/Négocier et éventuellement décryptez si vous connaissez les secrets.
Supprimez tous les fichiers de cache de tickets.
Authentifiez un utilisateur et demandez un TGT avec un tas d'options disponibles pour la demande.
Affichez tous les tickets dans un cache et demandez éventuellement plus de tickets.
Envoyez un « ping » AS-REQ à un KDC pour l'utilisateur actuel ou fourni afin d'obtenir des métadonnées pour l'utilisateur.
Affichez et manipulez les fichiers keytab avec prise en charge du dépannage.
Demandez un ticket pour l'utilisateur actuel et formatez les détails de manière utile.
L'outil expose des messages de journalisation utiles si vous transmettez le paramètre de ligne de commande /verbose
.
La bibliothèque fonctionnera sur toutes les plates-formes .NET Standard 2.0 prises en charge avec quelques mises en garde.
Vous pouvez utiliser cette bibliothèque de deux manières. La première consiste à télécharger le code et à le construire localement. La deuxième option, la meilleure, consiste simplement à utiliser nuget.
PM> Package d'installation Kerberos.NET
Vous pouvez utiliser cette bibliothèque de trois manières.
Le client est intentionnellement simple par rapport aux clients trouvés sur d'autres plateformes. Il est complet et prend en charge la génération de messages SPNego.
var client = new KerberosClient();var kerbCred = new KerberosPasswordCredential("[email protected]", "userP@ssw0rd!");attendre client.Authenticate(kerbCred);var ticket = attendre client.GetServiceTicket("host/appservice .corp.identityintervention.com");var header = "Négocier " + Convert.ToBase64String(ticket.EncodeGssApi().ToArray());
Héberger un KDC est un peu plus compliqué car cela nécessite une écoute sur un port particulier. Habituellement, vous écoutez sur le port 88.
var port = 88;var options = new ListenerOptions{ListeningOn = new IPEndPoint(IPAddress.Loopback, port),DefaultRealm = "corp.identityintervention.com".ToUpper(),RealmLocator = realmName => new MyRealmService(realmName)};var écouteur = new KdcServiceListener(options);attendre écouteur.Start();
L'écouteur attendra que listener.Stop()
soit appelé (ou supprimé).
L'authentification du ticket s'effectue en deux étapes. La première étape valide l'exactitude du ticket via un IKerberosValidator
avec une implémentation par défaut de KerberosValidator
. La deuxième étape consiste à convertir le ticket en un ClaimsIdentity
utilisable (un KerberosIdentity : ClaimsIdentity
spécifiquement), qui se produit dans KerberosAuthenticator
.
Le moyen le plus simple de commencer consiste à créer un nouveau KerberosAuthenticator
et à appeler Authenticate
. Si vous devez modifier le comportement de la conversion, vous pouvez le faire en remplaçant la méthode ConvertTicket(DecryptedData data)
.
var Authenticator = new KerberosAuthenticator (new KeyTable (File.ReadAllBytes ("sample.keytab")));var identité = Authenticator.Authenticate ("YIIHCAYGKwYBBQUCoIIG..."); Assert.IsNotNull (identité); ;Assert.IsFalse(string.IsNullOrWhitespace(name));
Notez que le paramètre constructeur de l'authentificateur est un KeyTable
. Le KeyTable
est un format courant utilisé pour stocker des clés sur d'autres plates-formes. Vous pouvez soit utiliser un fichier créé par un outil comme ktpass
, soit simplement transmettre une KerberosKey
lors de l'instanciation et cela aura le même effet.
Les packages nuget seront généralement tenus à jour avec toute modification apportée à la bibliothèque principale.
Hé, ça marche ! Ajoutez simplement le package nuget comme référence et c'est parti.
Plus d'informations
Active Directory nécessite la présence d'une identité correspondant au domaine où le jeton est envoyé. Cette identité peut être n'importe quel objet utilisateur ou ordinateur dans Active Directory, mais elle doit être configurée correctement. Cela signifie qu'il a besoin d'un nom principal de service (SPN). Vous pouvez trouver des instructions sur la configuration d’un utilisateur test ici.
Active Directory prend en charge les revendications depuis Server 2012. À l'époque, vous ne pouviez accéder aux revendications que via les principaux Windows ou la magie noire ADFS. Kerberos.NET prend désormais en charge de manière native l'analyse des revendications dans les tickets Kerberos. Jetez un œil au Guide des réclamations pour plus d’informations sur la configuration.
Kerberos.NET prend en charge le format de fichier KeyTable (keytab) pour transmettre les clés utilisées pour déchiffrer et valider les tickets Kerberos. Le format de fichier keytab est un format courant utilisé par de nombreuses plates-formes pour stocker des clés. Vous pouvez générer ces fichiers sous Windows à l'aide de l'utilitaire de ligne de commande ktpass
, qui fait partie du pack RSAT (Remote Server Administration Tools). Vous pouvez l'installer sur un serveur via PowerShell (ou via la boîte de dialogue d'ajout de composants Windows) :
Ajout de fonctionnalités Windows RSAT
À partir de là, vous pouvez générer le fichier keytab en exécutant la commande suivante :
ktpass /princ HTTP/[email protected] /mapuser IDENTITYINTERserver01$ /pass P@ssw0rd! /out sample.keytab /crypto all /PTYPE KRB5_NT_SRV_INST /mapop set
Le paramètre princ
est utilisé pour spécifier le PrincipalName généré et mapuser
qui est utilisé pour le mapper à l'utilisateur dans Active Directory. Le paramètre crypto
spécifie quels algorithmes doivent générer des entrées.
Les tickets AES sont pris en charge de manière native. Pas besoin de faire quoi que ce soit de plus !
Cela inclut également désormais la prise en charge de SHA256 et SHA384 via RFC8009.
Pour plus d’informations, voir Blindage FAST.
Ce n'est pas pris en charge actuellement, mais c'est sur la feuille de route.
Vous pouvez ajouter votre propre support pour d'autres algorithmes comme DES (je ne sais pas pourquoi vous le feriez, mais...) où vous associez un type Encryption à un Func<> qui instancie de nouveaux décrypteurs. Rien ne vous empêche également de lancer ce processus si vous le souhaitez.
KerberosRequest.RegisterDecryptor( EncryptionType.DES_CBC_MD5, (jeton) => nouveau DESMD5DecryptedData(jeton));
La détection de relecture intégrée utilise un MemoryCache
pour stocker temporairement les références aux hachages des noms occasionnels du ticket. Ces références sont supprimées à l'expiration du ticket. Le processus de détection a lieu juste après le décryptage dès que le numéro de séquence de l'authentificateur est disponible.
Notez que la logique de détection intégrée ne fonctionne pas efficacement lorsque l'application est en cluster, car le cache n'est pas partagé entre les machines. L'implémentation intégrée utilise un service en mémoire et, en tant que telle, n'est partagée avec personne.
Vous devrez créer un cache partagé entre les machines pour que cela fonctionne correctement dans un environnement en cluster. Cela a été considérablement simplifié grâce aux nouveaux services d’injection de dépendances .NET Core. Tout ce que vous avez à faire est d’enregistrer une implémentation IDistributedCache
. Vous pouvez trouver plus d’informations à ce sujet dans Microsoft Docs.
Si vous souhaitez utiliser votre propre détection de relecture, implémentez simplement l'interface ITicketReplayValidator
et transmettez-la dans le constructeur KerberosValidator
.
Il y a des échantillons !
KerbCrypto Fonctionne à travers les 6 formats de jetons pris en charge.
données-rc4-kerberos
rc4-spnego-données
aes128-kerberos-données
aes128-spnego-données
aes256-kerberos-données
aes256-spnego-données
KerbTester Un outil de ligne de commande utilisé pour tester de vrais tickets et vider les résultats analysés.
KerberosMiddlewareEndToEndSample Un exemple de bout en bout qui montre comment le serveur demande la négociation et la réponse du navigateur émulé.
KerberosMiddlewareSample Un simple exemple de middleware réussite/échec qui décode un ticket s'il est présent, mais qui autrement n'invite jamais à négocier.
KerberosWebSample Un exemple de projet Web destiné à être hébergé dans IIS qui invite à négocier et valide tous les tickets entrants provenant du navigateur.
Ce projet a une licence MIT. Voir le fichier de licence pour plus de détails. Consultez également le fichier Avis pour plus d’informations sur les licences des projets dont cela dépend.
Cette bibliothèque est livrée avec un utilitaire optionnel pour décoder les tickets de service. C'est facile à utiliser. Copiez simplement la copie codée en Base64 du ticket dans la zone de texte de gauche. Il décodera le message non crypté si vous ne fournissez pas de clé. Il tentera de déchiffrer le message si vous fournissez une clé. Vous n'aurez pas besoin de fournir une valeur d'hôte si le ticket a été chiffré à l'aide de RC4, mais il aura besoin d'une valeur d'hôte s'il est chiffré avec AES (pour dériver le sel). Alternativement, vous pouvez également inclure un fichier keytab si vous en avez également.
Vous pouvez le lancer à l'aide de l'outil Bruce avec bruce kdecode
.
Le décodeur convertira le ticket Kerberos en une arborescence structurée. Le processus est Kerberos ASN.1 => JSON () => Rendu Tree View. Voici le JSON intermédiaire qui vous montre toutes les informations disponibles dans le ticket.
{ "Request": {"KrbApReq": { "ProtocolVersionNumber": 5, "MessageType": "KRB_AP_REQ", "ApOptions": "Réservé", "Ticket": {"TicketNumber": 5, "Realm": "CORP. IDENTITYINTERVENTION.COM","SName": { "FullyQualifiedName": "desktop-h71o9uu", "IsServiceName": false, "Type": "NT_PRINCIPAL", "Name": ["desktop-h71o9uu" ]}, "EncryptedPart": { "EType": "AES256_CTS_HMAC_SHA1_96", "KeyVersionNumber": 3, "Cipher": "Vo4uodU2...coupe...XBwjmsshgyjs+Vr+A=="} }, "Authenticator": {"EType": "AES256_CTS_HMAC_SHA1_96","KeyVersionNumber": null,"Cipher": "NnLmEFkmO3HXCS...snip...up0YmNW5AicQVvvk" }},"KrbApRep": null }, "Déchiffré": {"Options": "Réservé", "EType": "AES256_CTS_HMAC_SHA1_96", "SName": { "FullyQualifiedName": "desktop-h71o9uu", "IsServiceName": false, "Type": "NT_PRINCIPAL", "Nom": ["desktop-h71o9uu" ]},"Authentificateur": { "AuthenticatorVersionNumber": 5, "Realm": "CORP.IDENTITYINTERVENTION.COM", "CName": {"FullyQualifiedName": "jack","IsServiceName": false,"Type": "NT_PRINCIPAL","Name": [ "jack"] }, "Somme de contrôle": {"Type": "32771", "Somme de contrôle": "EAAAAAAAAAAAAAAAAAAAAAAAAAAAA8QAAA" }, "CuSec": 305, "CTime": "2021-04-21T17:38:11+00:00", "Subkey": {"Usage": "Inconnu", "EType": "AES256_CTS_HMAC_SHA1_96", ValeurClé": "nPIQrMQu/tpUV3dmeIJYjdUCnpg0sVDjFGHt8EK94EM=" }, "SequenceNumber": 404160760, "AuthorizationData": [{ "Type": "AdIfRelevant", "Data": "MIHTMD+gBAICAI2hNwQ1M...snip...BJAE8ATgAuAEMATwBNAA=="} ]},"Ticket": { "Drapeaux": ["EncryptedPreAuthentication","PreAuthenticated","Renewable","Forwardable" ], "Key": {"Usage": "Unknown","EType": "AES256_CTS_HMAC_SHA1_96" ,"ValeurClé": "gXZ5AIsNAdQSo/qdEzkfw3RrLhhypyuG+YcZwqdX9mk=" }, "CRealm": "CORP.IDENTITYINTERVENTION.COM", "CName": {"FullyQualifiedName": "jack", "IsServiceName": false, "Type": "NT_PRINCIPAL", Nom": [ "jack"] }, "Transité": {"Type": "DomainX500Compress", "Contents": "" }, "AuthTime": "2021-04-21T17:24:53+00:00", "StartTime": "2021-04-21T17:38:11+00:00 ", "EndTime": "2021-04-22T03:24:53+00:00", "RenewTill": "2021-04-28T17:24:53+00:00", "CAddr": null, "AuthorizationData": [{ "Type": "AdIfRelevant", "Data": "MIIDIjCCAx6gBAICAIChg...snip ...muoGI9Mcg0="},{ "Type": "AdIfRelevant", "Données": "MF0wP6AEAgIAj...snip...AXg9hCAgAACTDBBAAAAAA="} ]},"DelegationTicket": null,"SessionKey": { "Usage": null, "EncryptionType": "AES256_CTS_HMAC_SHA1_96", "Host": null, "PrincipalName" : null, "Version": null, "Salt": "", "Mot de passe": null, "IterationParameter": "", "PasswordBytes": "", "SaltFormat": "ActiveDirectoryService", "RequiresDerivation": false}, "Skew": "00:05:00" }, "Computed": {"Name": "[email protected]","Restrictions": { "KerbAuthDataTokenRestrictions": [{ "RestrictionType": 0, "Restriction": {"Flags": "Full"," TokenIntegrityLevel": "Élevé", "MachineId": "Txr82+sI2kbFmPnkrjldLUfESt/oJzLaWWNqCkOgC7I=" }, "Type": "KerbAuthDataTokenRestrictions"},{ "RestrictionType": 0, "Restriction": {"Flags": "Full", "TokenIntegrityLevel": "High", "MachineId" : "Txr82+sI2kbFmPnkrjldLUfESt/oJzLaWWNqCkOgC7I=" }, "Type": "KerbAuthDataTokenRestrictions"} ], "KerbLocal": [{ "Valeur": "EBeD2EICAAAJMMEEAAAAAA==", "Type": "KerbLocal"},{ "Valeur": "EBeD2EICAAAJMMEEAAAAAA==", "Type": "KerbLocal"} ], "KerbApOptions": [{ "Options": "ChannelBindingSupported", "Type": "KerbApOptions"} ], "KerbServiceTarget": [{ "ServiceName": "[email protected]", "Type": "KerbServiceTarget"} ], "AdWin2kPac": [{ "Mode": "Serveur", "DecodingErrors": [], "Version": 0, "LogonInfo": {"PacType": "LOGON_INFO", "LogonTime": "2021-04-21T17:24:53.4021307+00:00","LogoffTime": "0001-01-01T00:00:00+00:00", "KickOffTime": "0001-01-01T00:00:00+00:00", "PwdLastChangeTime": "2021-01-14T23:55:39.0024458 +00:00","MotCanChangeTime": "2021-01-15T23:55:39.0024458+00:00", "PwdMustChangeTime": "0001-01-01T00:00:00+00:00", "UserName": "jack", "UserDisplayName": "Jack Handey","LogonScript": "","ProfilePath": "","HomeDirectory": "","HomeDrive": "","LogonCount": 99,"BadPasswordCount": 0,"UserId": 1126,"GroupId": 513,"GroupCount": 6,"GroupIds": [ {"RelativeId": 1132,"Attributs": [ "SE_GROUP_MANDATORY", "SE_GROUP_ENABLED_BY_DEFAULT" , "SE_GROUP_ENABLED"] }, {"RelativeId": 1131,"Attributs": [ "SE_GROUP_MANDATORY", "SE_GROUP_ENABLED_BY_DEFAULT", "SE_GROUP_ENABLED"] }, {"RelativeId": 1128,"Attributs": [ "SE_GROUP_MANDATORY", "SE_GROUP_ENABLED_BY_DEFAULT", "SE_GROUP_ENABLED"] }, {"RelativeId": 1130,"Attributs": [ "SE_GROUP_MANDATORY", "SE_GROUP_ENABLED_BY_DEFAULT", "SE_GROUP_ENABLED"] }, {"RelativeId": 513,"Attributs": [ "SE_GROUP_MANDATORY", "SE_GROUP_ENABLED_BY_DEFAULT", "SE_GROUP_ENABLED"] }, {"RelativeId": 1129,"Attributes": [ "SE_GROUP_MANDATORY", "SE_GROUP_ENABLED_BY_DEFAULT", "SE_GROUP_ENABLED"] }],"UserFlags": "LOGON_EXTRA_SIDS", "UserSessionKey": "AAAAAAAAAAAAAAAAAAAAAA==", "ServerName": "DC01u0000", "DomainName": "CORPu0000", "DomainId": "S-1-5-21-311626132-1109945507-1757856464", "Réservé1" : "AAAAAAAAAAA=","UserAccountControl": [ "ADS_UF_LOCKOUT", "ADS_UF_NORMAL_ACCOUNT"],"SubAuthStatus": 0,"LastSuccessfulILogon": "1601-01-01T00:00:00+00:00","LastFailedILogon": "1601-01-01T00:00:00+00:00","FailedILogonCount": 0,"Reserved3": 0,"ExtraSidCount": 1,"ExtraIds": [ {"Sid": "S-1-18 -1","Attributs": [ "SE_GROUP_MANDATORY", "SE_GROUP_ENABLED_BY_DEFAULT", "SE_GROUP_ENABLED"] }],"ResourceDomainId": null,"ResourceGroupCount": 0,"ResourceGroupIds": null,"UserSid": { "Id": 1126, "Attributs": "0", "Value": "S-1-5-21-311626132-1109945507-1757856464-1126"},"GroupSid": { "Id": 513, "Attributs": "0", "Valeur": "S-1-5-21-311626132-1109945507-1757856464-513"},"GroupSids": [ {"Id": 1132,"Attributs": [ "SE_GROUP_MANDATORY", "SE_GROUP_ENABLED_BY_DEFAULT", "SE_GROUP_ENABLED"]," Valeur": "S-1-5-21-311626132-1109945507-1757856464-1132" }, {"Id": 1131,"Attributs": [ "SE_GROUP_MANDATORY", "SE_GROUP_ENABLED_BY_DEFAULT", "SE_GROUP_ENABLED"],"Valeur": "S-1-5-21-311626132-1109945507-1757856464-1131" }, {"Id": 1128,"Attributs": [ "SE_GROUP_MANDATORY", "SE_GROUP_ENABLED_BY_DEFAULT", "SE_GROUP_ENABLED"],"Valeur": "S-1-5-21-311626132-1109945507-1757856464-1128" }, {"Id": 1130,"Attributs": [ "SE_GROUP_MANDATORY", "SE_GROUP_ENABLED_BY_DEFAULT", "SE_GROUP_ENABLED"],"Valeur": "S-1-5-21-311626132-1109945507-1757856464-1130" }, {"Id": 513,"Attributs": [ "SE_GROUP_MANDATORY", "SE_GROUP_ENABLED_BY_DEFAULT", "SE_GROUP_ENABLED"],"Valeur": "S-1-5-21-311626132-1109945507-1757856464-513" }, {"Id": 1129,"Attributs": [ "SE_GROUP_MANDATORY", "SE_GROUP_ENABLED_BY_DEFAULT", "SE_GROUP_ENABLED"],"Valeur": "S-1-5-21-311626132-1109945507-1757856464-1129" }],"ExtraSids": [ {"Id": 1,"Attributs": "0","Valeur": "S-1-18 -1" }],"ResourceDomainSid": null,"ResourceGroups": [],"DomainSid": { "Id": 1757856464, "Attributs": "0", "Valeur": "S-1-5-21-311626132-1109945507-1757856464"} }, "ServerSignature": {"Type": "HMAC_SHA1_96_AES256", Signature": "Q0gnRmxBoh5w0DzS", "RODCIdentifier": 0, "PacType": "0" }, "CredentialType": null, "KdcSignature": {"Type": "HMAC_SHA1_96_AES256", "Signature": "HVsreq5rqBiPTHIN", "RODCIdentifier": 0,"PacType": "0" }, "ClientClaims": null, "DeviceClaims": null, "ClientInformation": {"ClientId": "2021-04-21T17:24:53+00:00","Name": "jack","PacType": "CLIENT_NAME_TICKET_INFO" }, "UpnDomainInformation": {"Upn": "[email protected]","Domain": "CORP.IDENTITYINTERVENTION.COM","Drapeaux": "0", "PacType": "UPN_DOMAIN_INFO" }, "DelegationInformation": null, "HasRequiredFields": true, "Type": "AdWin2kPac"} ]},"ValidationMode": "Pac","Claims": [ { "Type": "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/sid","Valeur": "S-1-5-21-311626132-1109945507-1757856464-1126" }, {"Type": "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname","Valeur ": "Jack Handey" }, {"Type": "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier","Value": "[email protected]" }, {"Type": "http://schemas .microsoft.com/ws/2008/06/identity/claims/groupsid","Valeur : "S-1-5-21-311626132-1109945507-1757856464-1132" }, {"Type": "http://schemas.microsoft.com/ws/2008/06/identity/claims/groupsid","Valeur " : "S-1-5-21-311626132-1109945507-1757856464-1131" }, {"Type": "http://schemas.microsoft.com/ws/2008/06/identity/claims/groupsid","Valeur " : "S-1-5-21-311626132-1109945507-1757856464-1128" }, {"Type": "http://schemas.microsoft.com/ws/2008/06/identity/claims/groupsid","Valeur " : "S-1-5-21-311626132-1109945507-1757856464-1130" }, {"Type": "http://schemas.microsoft.com/ws/2008/06/identity/claims/groupsid","Valeur " : "S-1-5-21-311626132-1109945507-1757856464-513" }, {"Type": "http://schemas.microsoft.com/ws/2008/06/identity/claims/role","Valeur ": "Utilisateurs du domaine" }, {"Type": "http://schemas.microsoft.com/ws/2008/06/identity/claims/groupsid","Value": "S-1-5-21-311626132-1109945507-1757856464-1129" }, {"Type " : "http://schemas.microsoft.com/ws/2008/06/identity/claims/groupsid","Value": "S-1-18-1" }] }, "KeyTable": {"FileVersion": 2,"KerberosVersion": 5,"Entries": [ {"EncryptionType": "NULL","Length": 0,"Timestamp": "2021-04-21T23:52 : 22.5460123+00:00","Version": 5,"Hôte": null,"Mot de passe": "jBBI1KL19X3olbCK/f9p/+cxZi3RnqqQRH4WawB4EzY=","KeyPrincipalName": { "Realm": "CORP.IDENTITYINTERVENTION.COM", "Names": ["STEVE-HOME" ], "NameType": "NT_SRV_HST", "FullyQualifiedName" : "STEVE-HOME"},"Sel": null }] }}