10

Je suis en train de refactoriser une application Web ASP.NET qui fonctionne pour exposer l'interface des services Web à l'aide du service Web ASP.NET. Selon Web Services authentication - best practices, l'authentification de base sur https est le chemin à parcourir. Supposons que ce soit, par opposition à faire WS-Security, X509, etc.Authentification de base HTTP personnalisée pour les services Web ASP.NET sur .NET 3.5/VS 2008

Sur .NET 3.5/VS 2008, quelle est la manière la plus simple d'implémenter l'authentification de base personnalisée HTTP (compte non-Windows), par exemple, accepter seulement si le nom d'utilisateur est "foo" et le mot de passe est "bar". En fin de compte, je voudrais Thread.CurrentPrincipal ensemble.

Est-ce que j'écris le mien HttpModule ou est-ce que cela peut être fait plus simplement?

Répondre

5

Probablement en utilisant Custom Basic Authentication for IIS, écrit par Dominick Baier est le chemin à parcourir. As he points out Les noms d'utilisateur de WCF 3.5 sur la sécurité de transport ne peuvent pas être utilisés sur un service hébergé par IIS, bien que ma question concernait les services Web ASP.NET et non WCF.

Il existe une autre implémentation du module HTTP appelée Basic authentication in ASP.NET against custom datasource par Santosh Sahoo.

Bien que ce ne soit pas ce que je voulais, j'ai trouvé que QuickStart Tutorial's SOAP Headers sample était une solution de contournement informative. L'envoi de mot de passe en texte brut sur http est clairement non sécurisé, mais cet exemple pourrait être étendu pour ajouter plus de sécurité, par exemple sur https ou en envoyant un hash de "mot de passe + GUID unique + horodatage".

1

Si vous envisagez WCF, vous pouvez utiliser la sécurité usernameOverTransport pour basicHttpBinding. C'est-à-dire que le nom d'utilisateur et le mot de passe résident dans l'en-tête SOAP de la requête et que tout le trafic est protégé par un cryptage SSL sur le réseau.

Un validateur UserNamePasswordValidator personnalisé peut être utilisé pour authentifier les informations d'identification entrantes, par ex. base de données.

Vous pouvez définir l'entité principale dans une IAuthorizationPolicy personnalisée dans le comportement du service.

par exemple. Évaluer la mise en œuvre de la méthode pour IAuthorizationPolicy pour le réglage courant principal

public bool Evaluate(EvaluationContext evaluationContext, ref object state) 
{ 
     Object obj; 
     if(evaluationContext.Properties.TryGetValue("Identities", out obj)) 
     { 
      // get the authenticated identity 
      IIdentity client = (obj as IList<IIdentity>)[0]; 
      evaluationContext.Properties["Principal"] = ... // create principal obj here for the identity 
      // this will set thread's current principal 
     } 
     return true; 
} 
+0

Je veux un utilisateur et un mot de passe dans l'en-tête http, pas dans l'en-tête SOAP. Aussi nom d'utilisateur sur le transport ne fonctionne pas sur IIS: http://www.leastprivilege.com/WCFUsernamesOverTransportAndIISHosting.aspx –

+0

usernameOverTransport pour basicHttpBinding fonctionne certainement même hébergé dans IIS, j'ai la solution déployée à la production il y a un certain temps. Gardez à l'esprit que ce n'est pas une authentification de base configurée dans IIS. c'est au niveau du message de savon. –

3

Prenez la valeur de l'en-tête Authorization, analyser et valider le nom d'utilisateur/mot de passe.

La valeur est nom d'utilisateur: mot de passe, codé en tant que chaîne Base64.

Voir http://en.wikipedia.org/wiki/Basic_access_authentication pour plus de détails.

Modifier: si vous voulez que cela fait pour chaque demande, en utilisant le schéma d'authentification personnalisé, il serait plus facile d'écrire un HttpModule pour gérer l'analyse syntaxique l'en-tête et définissant la principale du fil.

Questions connexes