WCF nom d'utilisateur d'Authentification: puis-je obtenir le nom d'utilisateur personnalisé dans un ServiceAuthorizationManager?
J'ai un service WCF qui est à l'aide d'un custom ServiceAuthorizationManager
. La coutume auth manager est déjà mis en place pour gérer les Fenêtres et les Formes d'authentification.
Cependant, si je me connecte avec un client qui est mis à UserName
auth, je n'arrive pas à trouver le nom de l'utilisateur n'importe où.
Le client code ressemble à ceci:
this.ClientCredentials.UserName.UserName = "user";
this.ClientCredentials.UserName.Password = "pass";
this.Open();
this.MyMethod(); //my actual contract method
this.Close();
Puis sur le serveur, j'ai mon personnalisée auth manager:
public sealed class AppAuthorizationManager : ServiceAuthorizationManager
{
public override bool CheckAccess(OperationContext operationContext, ref Message message)
{
//would like to check user/pwd here...
}
}
Est-ce possible?
- La
Thread.CurrentPrincipal
n'est pas définie, operationContext.ServiceSecurityContext.PrimaryIdentity
n'est pas définie.operationContext.ServiceSecurityContext.AuthorizationContext.ClaimSets
est vide.
Est le user/pwd censé être disponible n'importe où? Ou dois-je ajouter un UsernamePasswordValidator
trop?
Mise à jour: j'ai Donc ajouté une coutume UserNamePasswordValidator
et un IAuthorizationPolicy
.
Ma mise à jour de la WCF config ressemble à ceci:
<behavior name="Server2ServerBehavior">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
<serviceAuthorization principalPermissionMode="Custom" serviceAuthorizationManagerType="MyApp.AuthManager, MyApp">
<authorizationPolicies>
<add policyType="MyApp.TokenAuthorizationPolicy, MyApp" />
</authorizationPolicies>
</serviceAuthorization>
<serviceCredentials>
<userNameAuthentication customUserNamePasswordValidatorType="MyApp.PFUserNameValidator, MyApp" />
</serviceCredentials>
</behavior>
Si j'ai mis un point d'arrêt dans tous les 3 de ces classes, WCF lève l'exception:
LogonUser failed for the 'username' user. Ensure that the user has a valid Windows account.
at System.IdentityModel.Selectors.WindowsUserNameSecurityTokenAuthenticator.ValidateUserNamePasswordCore(String userName, String password)
Avant tout d'entre eux sont exécutés. Hmmm...
OriginalL'auteur CodingWithSpike | 2009-02-09
Vous devez vous connecter pour publier un commentaire.
C'est normalement traitée dans le UsernamePasswordValidator - qui est le seul endroit où vous aurez accès au mot de passe. Cependant, ce n'est pas l'endroit où vous définissez les principaux - qui serait dans le
IAuthorizationPolicy
'sEvaluate
méthode, qui pourrait ressembler à quelque chose comme:(où
TrustedAuthType
est le nom de notre mot de passe du programme de validation)Dans ce lieu, le thread principal sera défini, et nous pouvons nous identifier (et de l'utilisation des rôles de base de la sécurité, etc)
Quel pourrait être le problème si les "Identités" est null? Je vais avoir une "coutume" principalPermissionMode trop et un AuthorizationPolicy tout comme vous avez dans votre exemple
alors il dirait qu'ils sont anonymes... au-delà de ça, difficile de répondre.
J'ai résolu le "Identités" le problème, c'était un problème local sur mon poste de travail, il ne fonctionne pas correctement. Cependant, le problème que j'ai reçu par la suite a été que j'ai eu à usurper mon identité, ce qui n'était pas peut-être à l'étape de la coutume des politiques d'autorisation. Je suis donc allé à cette approche qui je l'ai indiqué dans mon post de blog (si quelqu'un arrive à avoir le même problème): blog.js-development.com/2010/11/...
bon lien, merci pour l'ajout
OriginalL'auteur Marc Gravell