Client-serveur d'authentification à l'aide de SSPI?
Je suis en train de travailler sur une application client-serveur et je veux que le client de s'authentifier auprès du serveur à l'aide de l'utilisateur, les informations d'identification d'ouverture de session, mais je ne veux pas l'utilisateur d'avoir à entrer leur nom d'utilisateur et mot de passe. Certes, je ne veux pas être responsable de la manipulation en toute sécurité des mots de passe. J'ai seulement besoin de l'utilisateur à me prouver qu'ils sont bien qui ils disent qu'ils sont, et puis mon serveur pouvez aller de l'avant et de l'accorder ou de refuser des commandes comme il lui plaît.
Mes utilisateurs font partie d'un domaine, et donc, je veux être en mesure d'utiliser les informations d'identification d'ouverture de session, ils ont créé lors de l'ouverture de session.
Je ne suis pas en utilisant toute sorte de web services, ni ce que je veux. Je contrôle à la fois le client et le logiciel de serveur, et les deux sont écrits en pur C# et utiliser le bon vieux sockets pour obtenir le travail effectué.
Je préfère le faire avec de la pure C#/.Net, mais je suis ouvert à dangereux à l'aide de C# et pinvokes win32 API si cela signifie que je vais faire le travail.
J'ai lu un peu sur SSPI dans windows, mais je suis une sorte de sentiment autour dans l'obscurité puisque ce genre de développement de l'application est nouveau pour moi.
Quelqu'un sait comment faire cela? Est SSPI le chemin? Comment utiliser SSPI à partir de C#? Est-il un .Net-native moyen pour que mon code peut rester portable?
- Bien avez-vous regardé à l'aide de l'Authentification Windows? Ce type d'authentification utilisera le domaine de l'utilisateur nom d'utilisateur pour valider l'accès au serveur. la chaîne de connexion doit ressembler à quelque chose comme ceci Serveur=myServerAddress;Database=mabase;Trusted_Connection=True;
- Je ne pense pas qu'il y est une .NET native façon de le faire. Il y a cependant un échantillon à partir de MS montrant comment utiliser SSPI. Elle implique la création d'un managed C++ qui gère SSPI et fournit une interface pour .NET. Pour être franc, je n'étais pas en mesure de l'exécuter sur Windows 8.1 et n'avait pas l'air dans le débogage, mais il peut être une bonne lecture pour vous. msdn.microsoft.com/en-us/library/ms973911.aspx je recommande que vous repenser votre décision sur l'utilisation de la plaine de sockets lorsque vous avez des solutions plus simples dans .NET.
- Pour clarifier les choses: Comme WCF peut le faire sans l'aide de IIS/ASP.NET, mais la plaine sockets je devrais aussi être en mesure de le faire. La WCF code source (disponible par le biais de la source de référence de la licence) est confus et difficile à suivre.
Vous devez vous connecter pour publier un commentaire.
Mise à jour:
SSPI est le droit pour cette approche. L'API n'est pas trop dur à utiliser, mais il est de taille décente du projet de regrouper en C#.
Dans le processus de la recherche de ce qui est nécessaire pour résoudre cette question, j'ai écrit un projet à offrir en SSPI .Net. Ci-dessous, je décris les principes de base de l'interfaçage avec Windows SSPI API pour que n'importe qui peut reproduire les résultats de ma recherche. Si vous vous trouvez vouloir utiliser en SSPI .Net, je peut vous suggérons d'utiliser le projet que j'ai créé pour résoudre ce problème:
NSspi - Un .Net de l'interface de la SSPI API
SSPI vous offre raw tableaux d'octets contenant des jetons d'authentification que vous décidez ensuite de la façon de transmettre - être sur un socket binaire format des messages, un XML personnalisé canal .Net Remoting, une certaine forme de la WCF, heck, même un port série. À vous de décider comment traiter avec eux. Avec SSPI un serveur peut authentifier les clients, identifier en toute sécurité le client, et même d'effectuer des messages de base sur les procédures de manipulation, comme le cryptage/signature en utilisant le contexte de sécurité établi avec le client.
La SSPI API est décrite ici: SSPI API aperçu
Spécifiquement de prendre un coup d'oeil à l'une des fonctions suivantes:
Le flux de travail typique est que de chaque côté d'initialiser leurs informations d'identification à l'aide de Laacquirecredentialshandle. L'authentification cycle démarre et progresse comme suit:
le cycle n'est pas complète.
Ce cycle se poursuit jusqu'à ce que le client voit InitializeSecurityContext return 'OK' et le serveur voit AcceptSecurityContext return 'OK'. Chaque fonction peut retourner " OK " et encore fournir une sortie jeton (comme indiqué par un non-retour null), pour indiquer qu'il a encore à envoyer des données vers l'autre côté. De cette façon, le client sait que sa moitié est fait, mais le serveur est encore incomplète, et vice-versa, si le serveur est terminée avant que le client. De quel côté se termine en premier (renvoie "OK") dépend du package de sécurité utilisé sous le capot en SSPI, et tout SSPI consommateurs doivent être conscients de cela.
Les informations ci-dessus devrait être suffisant pour quiconque d'être en contact avec le SSPI système afin de fournir 'Authentification Intégrée de Windows" dans leur application et de reproduire les résultats de ma recherche.
Ci-dessous est ma précédente réponse que j'ai appris à invoquer la SSPI API.
Je l'avais oublié cette question, et par coïncidence, est retourné à ce problème il y a quelques jours sur un coup de tête. J'ai besoin de résoudre ce problème dans un an ou deux si 🙂
C'est possible .Net, et je suis en train de développer une .Net SSPI wrapper que j'ai l'intention de publier.
Je vais baser mon travail sur les SSPI échantillons de Microsoft, je trouve.
L'échantillon contient un C++/CLI géré assemblée qui implémente les parties nécessaires de la SSPI API (dans le dossier
Microsoft\Samples\Security\SSPI\SSPI
extrait de l'REMSSPI.exe fichier). Ensuite, ils ont deux interfaces utilisateur, une application client et un serveur d'application écrite en C# qui rendent l'utilisation de cette API pour effectuer l'authentification SSPI.L'Isu faire usage de l' .Net remoting installation de lier tout cela ensemble, mais si je comprends la SSPI API correctement, la seule information que le client et le serveur ont besoin d'échanger des se compose de byte[]contenant contexte de sécurité jeton de données, qui peut être facilement intégrée dans toutes les infrastructures de communication que vous souhaitez, dans mon cas, un protocole binaire de ma propre conception.
Quelques notes sur l'obtention de l'échantillon de travail - ils ont le "SSPI" bibliothèque de la source, qui a le mieux compile sous VS 2005, bien que j'ai eu à le faire fonctionner sous 2008; 2010 ou au-dessus aurait besoin d'un peu retravailler car ils utilisent la langue des constructions qui ont été désapprouvées. Vous pouvez aussi avoir besoin de modifier les fichiers d'en-tête qui font partie de votre kit de développement platform SDK, parce qu'ils font de l'utilisation de const pointeur affectations à unconst variables, et je ne sais pas une meilleure façon de faire le bonheur du compilateur (je n'ai jamais utilisé le C++/CLI avant).
Ils ne comprennent compilé SSPI dll dans le Microsoft\Samples\Security\SSPI\bin. Pour obtenir le client/serveur de fichiers binaires pour travailler, vous devez copier dll de leur répertoire bin, sinon l'échec de la résolution de l'assemblée.
Donc, pour résumer:
bin\
- contient dll compiléeMicrosoft.Samples.Security.SSPI.dll
SSPI\
- contient la source à la dllSample\
- contient le code source de l'INTERFACE utilisateurbin\
- Contient construire l'INTERFACE utilisateur des échantillons. Copie de la SSPI.dll fichier et exécuterControlPanel.Client.exe
etControlPanel.Server.exe
NegotiateStream
dans .NET?Nikola est correct; il n'en est pas un .NET-native façon d'accomplir ce que vous êtes en train de faire (au moins, ne pas utiliser de bas niveau .NET de la prise en charge des Sockets). Vous pouvez certainement plongée sous les couvertures pour faire quelques interop la magie noire, mais si à la fois le client et le serveur sont sous votre contrôle, vous pouvez peut-être envisager d'aller jusqu'à la pile un peu et à l'aide d'un niveau plus élevé de l'API comme WCF, qui N'ont .NET-support natif pour l'authentification Intégrée de Windows.
En fonction de votre question et de votre décrite environnement, vous seriez en mesure d'utiliser le NetTcpBinding, qui offre de hautes performances ainsi que la plomberie pour l'authentification/identification du flux que vous cherchez pour (il propose également un assez propre façon de gérer l'autorisation à l'aide de la ServiceAuthorizationManager classe). Sans connaître les détails de votre application/service que je ne peux pas fournir un "Comment faire" pour mettre en œuvre ce que vous cherchez à faire, mais je peux point vous à la documentation qui ont une assez simple exemple.
Je suis totalement tort avec WindowsIdentity (ce qui est bon pour autorisation) parce que j'ai oublié que WCF gère beaucoup de choses avec des fichiers de configuration de sécurité du point d'extrémité et le message/la sécurité du transport.
Avez-vous essayé avec NegotiateStream ? L'exemple donné semble mieux adaptée à vos besoins : il utilise Kerberos pour l'authentification avant d'en permettre la lecture/écriture. À l'aide de la
CredentialCache.DefaultNetworkCredentials
devrait vous éviter de requête pour un mot de passe.Vous vous demandez peut - "Comment le serveur confirmer un client qui ils disent qu'ils sont?"
Réponse: Si tous les allers-retours de la poignée de main pourrait être terminé avec succès, c'est à dire à la fois
InitializeSecurityContext
renvoie "OK"AcceptSecurityContext
renvoie "OK"cela signifie que le client Windows identifiants de connexion ont été confirmé pour être vrai.
AcceptSecurityContext sorties d'un
CtxtHandle
contexte de sécurité (par le biais de la 6ème paramètre).Ce handle de contexte comprend le client de connexion Windows de l'utilisateur nom d'utilisateur. Le serveur peut obtenir du client nom d'utilisateur windows en appelant QueryContextAttributesEx:
Ce remplit un Noms Autochtones structure:
la valeur
pinfo.sClientName
du client sont le véritable nom d'utilisateur de connexion.Note: de La précédente poignée de main déjà garantir la vérité de contexte de sécurité, de sorte que le serveur ne crois
pinfo.sClientName
est juste le client réel de nom d'utilisateur windows.Jamais essayé de travailler avec WindowsIdentity ?
Pure C#/.Net, serializable et GetCurrent() retourne l'exécution de compte.
cité de Windows Identité De Création Livre Blanc
Votre question principale était :
La WindowsIdentity "est" le jeton d'authentification émis par votre contrôleur de domaine et me semble être la meilleure approche à ce moment.
Je savais très peu sur WindowsIdentity quand j'ai posté, mais j'ai aussi senti qu'il allait aider avec votre problème et des contraintes. J'ai fait beaucoup de lecture et finalement venu à cet page.
L'introduction de WIF est auto-explicatif, WindowsIdentity est un nouveau jeu de la .NET framework conçu pour Windows/sécurité basée sur les rôles des préoccupations.
SSPI, Kerberos sont des parties de l'ensemble du processus d'authentification Windows, le jeton de connexion obtenus par l'utilisateur/machine/processus est accordée par le contrôleur de domaine et ne peut être obtenue par "simplement" instanciating un nouvel objet WindowsIdentity. Si ce genre d'illégal instanciation de l'existence, l'ensemble du modèle de sécurité de Windows (domaines, contrôle de compte d'utilisateur, etc.) serait morte.
Voici un (très!) petit programme en mode console qui lève une exception si vous n'êtes pas partie de la "BUILTIN\Administrateurs" (modifier le nom du groupe en fonction de vos propres besoins). Chaque fois que "Exécuter en tant qu'Administrateur", le programme se termine sans erreur.
Il existe un très grand ensemble d'autorisations et chaque demande est basée sur les revendications (qui est de l'identité de memeber de xxx ?)
J'espère que cela aidera.
WindowsIdentity
.My users are part of a domain, and so I want to be able to use the logon credentials they created when they logged in.
Envoyer cette identification de connexion (oui, WindowsIdentity) pour le serveur et exécuter des vérifications de sécurité côté serveur (impersonnation), Soit vous faites confiance à votre contrôleur de domaine à la question de l'ouverture de session des jetons et des informations d'identification associées (ou les allégations), soit vous n'avez pas (et puis aurez besoin d'un SSPI-complient méthode d'authentification qui nécessitent un mot de passe)