context.Request.User ist in OWIN OAuthAuthorizationServerProvider null
Ich versuche, OAuth mithilfe von OWIN für einen Web API v2-Endpunkt in meinem lokalen Intranet zu implementieren. Die API wird in IIS mithilfe der integrierten Windows-Authentifizierung gehostet. Kurz gesagt, das ist es, was ich passieren möchte.
Wenn ich nach meinem Token at / token frage
Ziehen Sie den WindowsPrincipal aus dem OWIN-Kontext heraus
Verwenden Sie die SID des WindowsPrincipal, um einige Rollen für diesen Benutzer in einer SQL-Tabelle nachzuschlagen.
Erstellen Sie eine neue ClaimsIdentity, in der der Benutzername und die Rollen gespeichert sind
Verwandle das in ein Json Web Token (JWT), das ich bak geschickt habe
Wenn ich mithilfe meines Tokens eine Ressource von meiner API anfordere
Konvertieren Sie das JWT-Inhaber-Token zurück in die ClaimsIdentity
Verwenden Sie ClaimsIdentity, um Anforderungen an die Ressource nach Rolle zu autorisieren
Auf diese Weise muss ich nicht bei jeder Anforderung eine Datenbanksuche nach Benutzerrollen durchführen. Es ist nur in die JWT eingebrannt.
Ich denke, ich richte alles richtig ein. Meine Startup.Configuration-Methode sieht so aus.
public void Configuration(IAppBuilder app)
{
// token generation
// This is what drives the action when a client connects to the /token route
app.UseOAuthAuthorizationServer(new OAuthAuthorizationServerOptions
{
// for demo purposes
AllowInsecureHttp = true,
TokenEndpointPath = new PathString("/token"),
AccessTokenExpireTimeSpan = TimeSpan.FromHours(8),
AccessTokenFormat = GetMyJwtTokenFormat(),
Provider = new MyAuthorizationServerProvider()
});
//// token consumption
app.UseOAuthBearerAuthentication(
new OAuthBearerAuthenticationOptions()
{
Realm = "http://www.ccl.org",
Provider = new OAuthBearerAuthenticationProvider(),
AccessTokenFormat = GetMyJwtTokenFormat()
}
);
app.UseWebApi(WebApiConfig.Register());
}
So sieht der MyAuthorizationServerProvider aus ...
public class MyAuthorizationServerProvider : OAuthAuthorizationServerProvider { public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context) { // Since I'm hosting in IIS with Windows Auth enabled // I'm expecting my WindowsPrincipal to be here, but it's null :( var windowsPrincipal = context.OwinContext.Request.User.Identity; // windowsPrincipal is null here. Why? // Call SQL to get roles for this user // create the identity with the roles var id = new ClaimsIdentity(stuff, more stuff); context.Validated(id); } }
Mein Problem ist, dass context.Request.User hier null ist. Ich komme nicht zu meinem WindowsPrincipal. Wenn ich eine andere Dummy-Middleware erstelle, kann ich problemlos auf den WindowsPrincipal zugreifen. Warum ist es in diesem Zusammenhang null? Mache ich etwas falsch?