Warum ist meine ClaimsIdentity IsAuthenticated immer falsch (für Web-API-Autorisierungsfilter)?
In einer Web-API-Projekt bin ich überschreiben der normalen Authentifizierung, um zu überprüfen, Token anstelle. Der code sieht ungefähr so aus:
if ( true ) //validate the token or whatever here
{
var claims = new List<Claim>();
claims.Add( new Claim( ClaimTypes.Name, "MyUser" ) );
claims.Add( new Claim( ClaimTypes.NameIdentifier, "MyUserID" ) );
claims.Add( new Claim( ClaimTypes.Role, "MyRole" ) );
var claimsIdentity = new ClaimsIdentity( claims );
var principal = new ClaimsPrincipal( new[] { claimsIdentity } );
Thread.CurrentPrincipal = principal;
HttpContext.Current.User = principal;
}
Und dann später, wenn ich das [Authorize]
Attribut zu einem controller, es nicht zu genehmigen.
Debug-code bestätigt das gleiche Verhalten:
//ALWAYS FALSE!
if ( HttpContext.Current.User.Identity.IsAuthenticated ) {
//do something
}
Warum er denke, dass der Benutzer nicht authentifiziert ist, obwohl ich schon gebaut, eine gültige "ClaimsIdentity" - und zugeordnet es der thread?
InformationsquelleAutor der Frage explunit | 2013-11-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das problem ist, weil der eine bedeutende änderung in .Net 4.5. Wie erläutert durch dieser Artikeleinfach eine anspruchsbasierte Identität nicht mehr macht es IsAuthenticated true zurück. Stattdessen, Sie brauchen, um passieren einige string (egal was) in den Konstruktor.
Damit diese Zeile im obigen code:
Wird dies:
Und das problem ist gelöst. Update: siehe andere Antwort von Leo. Der genaue Wert der AuthenticationType möglicherweise oder möglicherweise nicht wichtig, je nachdem, was Sie in Ihren auth-pipeline.
Update 2: wie vorgeschlagen von Robin van der Knaap in den Kommentaren, einer der
System.Security.Claims.AuthenticationTypes
Werte angemessen sein könnte.InformationsquelleAutor der Antwort explunit
Während die Antwort zur Verfügung gestellt hat Gültigkeit, Sie ist nicht ganz korrekt. Sie können nicht davon ausgehen, dass gerade das hinzufügen der Zeichenfolge wird magisch arbeiten. Wie sagte in einem Kommentar, wird dieser string muss mit einem der
AuthenticationTypes
enumeration, die wiederum muss mit dem angegebenen in der OWIN-Authentifizierung/Autorisierung-middleware....zum Beispiel...Jedoch in dem oben beschriebenen Szenario wäre es auch keine große Rolle. Aber, wenn Sie mit mehreren Authentifizierungs - /Autorisierungs-Ebenen, die Forderungen in Verbindung gebracht werden, um die eine, die Spiele das gleiche
AuthenticationType
...ein anderes Beispiel ist, wenn Sie die cookie-Authentifizierung...wo
AuthenticationType
beschreibt den Namen des cookie, da Ihr die app bezogen haben, andere cookies von anderen Anbietern ist es wichtig, dass Sie dieAuthenticationType
beim instanziieren der Forderungen in der Reihenfolge zu verknüpfen, dann an die richtige cookieInformationsquelleAutor der Antwort Leo