Besoin de Certificat Client SSL uniquement pour des routes ou des contrôleurs de
J'ai un ASP.NET MVC projet Core à l'aide de Kestrel que le serveur. Il est à la fois servir le contenu de l'utilisateur (asp.net mvc) et accueille des contrôleurs d'API web que les agents (logiciels) de communiquer avec. J'ai activé le HTTPS et le certificat du client de support. Le problème est que je veux pour exiger des certificats client pour les agents (logiciels) que d'appeler des Web Api, mais je ne veux pas exiger/invite de certificats client régulier, basé sur le navigateur des utilisateurs.
J'ai activé le HTTPS/certificat du client de support de la manière suivante:
var host = new WebHostBuilder()
.UseKestrel(options =>
{
HttpsConnectionFilterOptions httpsoptions = new HttpsConnectionFilterOptions();
httpsoptions.ServerCertificate = CertUtil.GetServerCert();
httpsoptions.ClientCertificateMode = ClientCertificateMode.AllowCertificate;
httpsoptions.CheckCertificateRevocation = false;
options.UseHttps(httpsoptions);
})
.UseUrls("http://0.0.0.0:5000", "https://0.0.0.0:5001")
.UseContentRoot(Directory.GetCurrentDirectory())
.UseStartup<Startup>()
.Build();
host.Run();
J'ai séparé middleware gestionnaire de configuration de Démarrage.cs pour gérer personnalisé de vérification de certificats client. Ce code a exécuter avec succès et tout fonctionne bien dans ce sens.
Le problème est ce qui se passe à l'échelle mondiale et je suis seulement à la recherche d'appliquer les certificats clients des contrôleurs spécifiques et/ou de routes; ou vraiment je prendrais tout niveau de granularité à ce point.
Essentiellement en essayant de créer le même genre de comportement que vous pouvez obtenir dans IIS par la création de deux répertoires virtuels, puis définir les Paramètres SSL, à Accepter l'un et de l'Ignorer, de l'autre. L'un avec l'Accepter invite le navigateur pour un cert et l'un avec l'Ignorer ne sera pas.
J'ai essayé de réglage HttpsConnectionFilterOptions pour spécifier uniquement ServerCertificate dans l'espoir de ne pas fixer d'un certificat client des options liées à la permettrait au serveur pour recevoir des certificats clients si ils sont envoyés, mais sinon, pas d'invite de navigateurs pour eux. Cela ne semble pas fonctionner comme mon middleware certificat du client gestionnaire ne voit jamais un client cert lors de l'appel de cette fonction (c'est le cas lorsque ClientCertificateMode est fixé à AllowCertificate.
context.Connection.GetClientCertificateAsync();
Je suppose que dans court ne Crécerelle d'hébergement permettent même de plus granulaire mappage de certificat client/de la manipulation ou est-il seulement possible à l'aide de IIS? IIS n'est pas une option pour ce projet et je préférerais ne pas avoir à créer un projet/processus juste pour le client cert api aspects. Reconnaissant de toute aide!
- BTW cette question ici est de même nature mais de le faire pour IIS vs auto-hébergé asp.net le noyau avec la Crécerelle. stackoverflow.com/questions/27323880/...
Vous devez vous connecter pour publier un commentaire.
J'ai essayé de faire la même chose, avec exactement les mêmes exigences que vous.
Je suis venu à la conclusion qu'il n'est pas possible. Ma solution est d'utiliser 2
WebHostBuilder
objets - l'un des emplacements ne pas besoin client certs, et un pour ceux qui ne. Cela a l'inconvénient que chaqueIWebHost
doit écouter sur un port différent, mais à partir du scénario que vous décrivez, je suppose que c'est pas un gros problème.Je le fais ce dans le même processus, de sorte que cette solution répond à cette exigence.
J'ai eu le même problème avec
context.Connection.GetClientCertificateAsync();
il était toujours retourner null. Ensuite, j'ai remarqué que j'étais en train de Kestrel thru IIS Express tous les temps.Donc dans Visual Studio à partir de l'Debuger de la barre d'outils, j'ai changé de IIS Express pour mon projet. Kestrel a commencé comme l'application de la console et j'ai été en mesure d'obtenir le certificat client.
Je pense que IIS Express ne prend pas en charge les certificats clients de sorte que le certificat a toujours été ignoré.
Pour l'autre partie de la question; je pense que Kestrel dos pas en charge cette granularité que vous êtes à la recherche de la boîte lors de l'utilisation de la
HttpsConnectionFilterOptions
. À partir de la Kestrel Filtre de Connexion des Options de code source la connexion sera interrompue si le certificat client est null. Peut-être vous pouvez modifier le code source pour leHttpsConnectionFilterOptions
et de créer votre propre filtre d'elle. Ensuite, vous pouvez utiliser leClientCertificateValidation
propriété pour spécifier personnalisé certificat de validation de la méthode qui permet la connexion lorsque aucun certificat client n'est envoyer.Espère que cette aide.
J'ai compris comment faire pour avoir le Certificat du Client uniquement sur certaines routes, mais lorsqu'il est exécuté dans Azure Web App, le client cert n'est pas passé pour le code. C'est le même problème lors de l'exécution sous IIS Express.
Dans cet exemple, Un contrôleur a besoin d'aucune cert, les deux autres nécessite des certs.
https://github.com/xavierjohn/ClientCertificateMiddleware
Le certificat est passé par si il est pas fonctionner sous IIS Express.
Il n'est pas nécessaire d'utiliser isolé (nouveau) IWebHost pour contrôler l'accès à des contrôleurs MVC.
Utilisez simplement MVC Filtre à cette fin.