Question

Tout cela concerne la liaison WebHttp, hébergée dans un hôte de service personnalisé (IIS n'est pas une option pour le moment).

J'ai mis en place un nom d'utilisateur personnaliséPasswordValidator et un IAuthorizationPolicy personnalisé. Lorsque je configure la liaison du noeud final pour qu'elle utilise l'authentification de base, tout fonctionne comme je le voudrais (principal personnalisé, rôles personnalisés, etc.).

Je souhaite également ajouter la possibilité d'accès HTTP anonyme et laisser mes implémentations personnalisées attribuer à l'utilisateur anonyme des rôles par défaut, etc. (si aucun en-tête Authenticate n'est envoyé).

Ce qui se passe maintenant, c'est que les utilisateurs anonymes reçoivent un 401 avant qu'un de mes codes personnalisés ne soit touché. Si je désactive l'exigence d'authentification HTTP Basic, l'en-tête Authenticate est totalement ignoré.

Comment configurer, ou injecter un en-tête d'authentification "", dans les deux sens (sans créer deux points de terminaison distincts)?

Était-ce utile?

La solution

Tout d'abord, le service répond correctement à l'appel anonyme, conformément aux spécifications .

Deuxièmement, c'est impossible. Lorsque vous hébergez vous-même votre service et que vous avez une liaison http, WCF utilisera un System.Net.HttpListener pour pouvoir répondre aux demandes http (créé dans System.ServiceModel.Channels.SharedHttpTransportManager.OnOpen ) . Cet écouteur a une méthode appelée HandleAuthentication qui est appelée bien avant qu'un code personnalisé ne soit appelé. Il est chargé de renvoyer la réponse 401 avec le défi (WWW-Authenticate). Vous ne pouvez rien y faire. Si tel est le cas, j'aimerais le savoir.

Il ne vous reste donc que les options suivantes:

  • deux points de terminaison
  • configurez vos clients pour qu'ils connaissent les informations d'identification par défaut
  • changez vos clients pour qu'ils puissent relever le défi

Autres conseils

J'ai déjà effectué des recherches à ce sujet dans le passé et découvert que ce n'était pas possible via la configuration, sauf si vous créez 2 points de terminaison distincts (ce qui n'est pas ce que vous voulez). Ce n'est tout simplement pas pris en charge immédiatement par WCF.

Cependant, WCF est extrêmement personnalisable et vous pouvez probablement le faire en écrivant un canal / une liaison personnalisé qui fera ce que vous voulez. Je vous recommande de consulter le code REST Chess . Cela devrait vous aider à démarrer.

La meilleure solution consiste à implémenter des rôles par défaut via un fournisseur de rôles et à permettre aux utilisateurs anonymes de rejoindre automatiquement ce rôle. Ensuite, soit par programme, soit via une stratégie d'injection de stratégie (orientée aspect), de manière à ce que certains accès anonymes soient autorisés via le rôle particulier.

En ce qui concerne la configuration via la configuration, si cela est possible, ce serait plutôt difficile et en quelque sorte "hacky".

Je ne pense pas… J'écrivais simplement que vous devez créer une terminaison distincte lorsque j'ai décidé de relire votre question et de noter le dernier énoncé de votre question. Donc, la réponse serait non (à ma connaissance)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top