Pregunta

Estoy intentando implementar OAuth usando OWIN para un punto final de Web API v2 en mi intranet local.La API está alojada en IIS mediante la autenticación de Windows integrada.En resumen, esto es lo que quiero que suceda.

Cuando pido mi Token en /token

  1. Saque WindowsPrincipal del contexto OWIN

  2. Use el SID del WindowsPrincipal para buscar algunos roles para este usuario en una tabla SQL.

  3. Cree una nueva ClaimsIdentity que almacene el nombre de usuario y los roles.

  4. Conviértalo en un Json Web Token (JWT) que envié

Cuando solicito un recurso de mi API usando mi token

  1. Convierta el token JWT Bearer nuevamente a ClaimsIdentity

  2. Use esa identidad de reclamo para autorizar solicitudes al recurso por rol

  3. De esta manera, no tengo que hacer una búsqueda de base de datos para los roles de usuario en cada solicitud.Está recién integrado en el JWT.

Creo que estoy configurando todo correctamente.Mi método Startup.Configuration se ve así.

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 ve así...

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

Mi problema es que context.Request.User es nulo aquí.No puedo acceder a mi WindowsPrincipal.Si creo algún otro middleware ficticio, puedo acceder a WindowsPrincipal sin problemas.¿Por qué es nulo en este contexto?¿Estoy haciendo algo mal?

¿Fue útil?

Solución

Cambie el orden de UseOAuthAuthorizationServer y UseOAuthBearerAuthentication.UtiliceOAuthBearerLlamadas de autenticación UseStageMarker(PipelineStage.Authenticate); para que (y todo lo anterior) se ejecute antes en la canalización de ASP.NET.El usuario es nulo cuando se ejecuta durante la etapa de autenticación.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top