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?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage