In einem Web-API-Projekt überschreibe ich den normalen Authentifizierungsprozess, um stattdessen Token zu überprüfen. 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 später, wenn ich das [Authorize]
Attribut auf einen Controller anwende, kann es nicht autorisiert werden.
Debug-Code bestätigt das gleiche Verhalten:
// ALWAYS FALSE!
if ( HttpContext.Current.User.Identity.IsAuthenticated ) {
// do something
}
Warum wird der Benutzer nicht authentifiziert, obwohl ich eine gültige ClaimsIdentity erstellt und dem Thread zugewiesen habe?
Die bereitgestellte Antwort hat zwar eine gewisse Gültigkeit, ist jedoch nicht ganz richtig. Sie können nicht davon ausgehen, dass das Hinzufügen einer Zeichenfolge auf magische Weise funktioniert. Wie in einem der Kommentare angegeben, muss diese Zeichenfolge mit einer der
AuthenticationTypes
Aufzählungen übereinstimmen, die wiederum mit der in der OWIN-Authentifizierungs- / Autorisierungs-Middleware angegebenen übereinstimmen muss. Zum Beispiel ...public void ConfigureOAuth(IAppBuilder app) { app.UseCors(CorsOptions.AllowAll); OAuthAuthorizationServerOptions serverOptions = new OAuthAuthorizationServerOptions() { AllowInsecureHttp = true, TokenEndpointPath = new Microsoft.Owin.PathString("/token"), AccessTokenExpireTimeSpan = TimeSpan.FromDays(1), AuthenticationType = AuthenticationTypes.Password, AuthenticationMode = Microsoft.Owin.Security.AuthenticationMode.Active, Provider = new AppAuthServerProvider() }; app.UseOAuthAuthorizationServer(serverOptions); app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions() { AuthenticationMode = Microsoft.Owin.Security.AuthenticationMode.Active, AuthenticationType = AuthenticationTypes.Password }); }
Im obigen Szenario würde es jedoch nicht viel ausmachen. Wenn Sie jedoch mehr Authentifizierungs- / Autorisierungsstufen verwenden, werden die Ansprüche mit denen verknüpft, die mit denselben übereinstimmen. Ein
AuthenticationType
weiteres Beispiel ist die Verwendung der Cookie-Authentifizierung.public void Configuration(IAppBuilder app) { app.UseCookieAuthentication(new CookieAuthenticationOptions { AuthenticationType = "ApplicationCookie", LoginPath = new PathString("/auth/login") }); }
Wo
AuthenticationType
beschreibt den Namen des Cookies, da Ihre App möglicherweise andere Cookies von anderen Anbietern erhalten hat, ist es wichtig, dass Sie diese bei derAuthenticationType
Instanziierung der Ansprüche festlegen , um sie dann dem richtigen Cookie zuzuordnenquelle
AuthenticationType
, z . B. CookieAuthenticationDefaults.AuthenticationScheme oder JwtBearerDefaults.AuthenticationScheme .ClaimsIdentity
Sie beim Erstellen den Schemanamen alsAuthenticationType
(likenew ClaimsIdentity(claims, AuthenticationScheme)
) übergeben müssen. Andernfalls wird dieIsAuthenticated
Flagge auf der Identität seinfalse
. Ich bin in den letzten 2 Jahren zweimal auf dasselbe nicht intuitive Problem gestoßen, und diese Antwort hat mir wieder geholfen. Ich kann diese Antwort leider nicht zweimal positiv bewerten.