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?