context.Request.User é nulo em OWIN OAuthAuthorizationServerProvider

Estou tentando implementar o OAuth usando o OWIN para um ponto de extremidade da API da Web v2 na minha intranet local. A API está hospedada no IIS usando a autenticação interna do Windows. Em suma, é isso que eu quero que aconteça.

Quando solicito meu token em / token

Retire o WindowsPrincipal do contexto OWIN

Use o SID do WindowsPrincipal para procurar algumas funções para esse usuário em uma tabela SQL.

Crie um novo ClaimsIdentity que armazene o nome de usuário e as funções

Transforme isso em um Json Web Token (JWT) que enviei bak

Quando solicito um recurso da minha API usando meu token

Converta o token JWT Bearer de volta para o ClaimsIdentity

Use o ClaimsIdentity para autorizar solicitações ao recurso por função

Dessa forma, não preciso fazer uma pesquisa no banco de dados para funções de usuário em cada solicitação. É apenas cozido no JWT.

Acho que estou configurando tudo corretamente. Meu método Startup.Configuration se parece com isso.

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());

}

MyAuthorizationServerProvider aparece assim ...

    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);
        }
    }

Meu problema é que context.Request.User é nulo aqui. Não consigo acessar meu WindowsPrincipal. Se eu criar algum outro middleware fictício, posso acessar o WindowsPrincipal sem problemas. Por que é nulo neste contexto? Estou fazendo algo errado?

questionAnswers(1)

yourAnswerToTheQuestion