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

  1. Retire o WindowsPrincipal do contexto OWIN

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

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

  4. Transforme isso em um Json Web Token (JWT) que enviei de volta

Quando solicito um recurso da minha API usando meu token

  1. Converta o token JWT Bearer de volta para ClaimsIdentity

  2. Use que reivindica a identidade para autorizar solicitações ao recurso por função

  3. 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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top