Fil de discussion.CurrentPrincipal est authentifié mais ClaimsPrincipal.Actuel n'est pas
Je suis en utilisant les Réclamations fondées Autorisation dans mon WebApi projet et d'avoir une méthode où je l'ai vérifier si l'Identité actuelle est authentifié. Lorsque j'utilise ClaimsPrincipal.Current
l'Identité actuelle n'est pas authentifié, mais lorsque j'utilise Thread.CurrentPrincipal
il est.
ClaimsPrincipal.Current.Identity.IsAuthenticated; //False
Thread.CurrentPrincipal.Identity.IsAuthenticated; //True
Cela semble étrange, surtout depuis la MSDN dit ClaimsPrincipal.Actuel renvoie simplement le Fil de discussion.CurrentPrincipal:
Remarques
Par défaut, Fil.CurrentPrincipal est retourné. Vous pouvez modifier ce
comportement en définissant le ClaimsPrincipalSelector propriété pour spécifier un
délégué à être appelé à déterminer le courant principal.
Quelqu'un peut-il svp m'expliquer pourquoi ClaimsPrincipal
n'est pas authentifié, tout à la fois, en théorie, contiennent la même Identité?
Pas de la ClaimsPrincipalSelector est null, la valeur par défaut est utilisé.
OriginalL'auteur Jos Vinke | 2013-03-11
Vous devez vous connecter pour publier un commentaire.
En bref, la documentation est inexact de dire qu'il renvoie
Thread.CurrentPrincipal
par défaut.De quoi il retourne en fait est un
ClaimsPrincipal
emballageThread.CurrentPrincipal
(si ce n'est pas, en fait, déjà unClaimsPrincipal
), à l'aide de ce constructeur:Ce, à son tour, comme vous pouvez espérer le voir, est de retour d'une
ClaimsIdentity
que enveloppements le principal de l'identité (de nouveau, si ce n'est pas, en fait, déjà unClaimsIdentity
).Dans la construction de la
ClaimsIdentity
, le seul endroit où je peux voir où il sera à la fin de ne pas définir le type d'authentification (et donc la création d'une identité qui n'est pas authentifié) est ici:Donc, si l'identité que vous avez accès via
Thread.CurrentPrincipal.Identity
est en fait unWindowsIdentity
exemple, et dans le contexte dans lequel vous êtes en cours d'exécution que vous avez obtenu des autorisations restreintes, la constructionClaimsIdentity
instance ontIsAuthenticated
comme faux.Si c'est un
ClaimsPrincipal
déjà, puis le tout est discutable, car il devrait être de retour la même instance. EstReferenceEquals(ClaimsPrincipal.Current,Thread.CurrentPrincipal)
vrai?Elle retourne false en effet, la différence est que ClaimsPrincipal.Actuel est un Système.De sécurité.Les revendications.ClaimsPrincipal et du Fil.CurrentPrincipal est Microsoft.IdentityModel.Les revendications.ClaimsPrincipal. Mais je me demande encore pourquoi il est défini sur false.
dans ce cas, vous êtes de mélange âgées WIF code et plus récent (cuit dans le noyau) Cadre code d'identité. Il est donc susceptible de faire un peu de l'emballage que j'ai décrit ci-dessus.
J'ai couru dans un descrepency entre Thread.CurrentPrincipal et ClaimsPrincipal.Aussi bien. Dans mon cas, la question était de notre utilisation de l'authentification Windows, mais avec un processus ajoutée locale des revendications à partir de la base de données. Le résultant ClaimsPrincipal.Le courant a été un RolePrincipal, mais parce que RolePrincipal remplace l'Identité qu'il a été à la recherche pour les réclamations de sa propre Identité au lieu de partir de la base ClaimsPrincipal de l'Identité. La solution a été de définir la ClaimsPrincipalSelector de toujours renvoyer une nouvelle ClaimsPrincipal basé sur le Filetage.CurrentPrincipal.L'identité.
OriginalL'auteur Damien_The_Unbeliever