context.Request.User é nulo em OWIN OAuthAuthorizationServerProvider
-
21-12-2019 - |
Pergunta
Estou tentando implementar o OAuth usando OWIN para um endpoint da API Web v2 na minha intranet local.A API é hospedada no IIS usando autenticação interna do Windows.Resumindo, é isso que eu quero que aconteça.
Quando peço 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 de volta
Quando solicito um recurso da minha API usando meu token
Converta o token JWT Bearer de volta para ClaimsIdentity
Use que reivindica a identidade para autorizar solicitações ao recurso por função
Dessa forma, não preciso fazer uma pesquisa de banco de dados para as funções do usuário em cada solicitação.É apenas incorporado ao 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 se parece com isto...
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?
Solução
Troque a ordem de UseOAuthAuthorizationServer e UseOAuthBearerAuthentication.Chamadas UseOAuthBearerAuthentication UseStageMarker(PipelineStage.Authenticate);
para fazê-lo (e tudo antes dele) ser executado anteriormente no pipeline do ASP.NET.O usuário é nulo quando você executa durante o estágio de autenticação.