¿Cómo se rellenan OwinContext.Request.Path y PathBase?

Estoy escribiendo mi propio middleware OWIN para el flujo de código de autorización de OpenID Connect, basado en otros ejemplos en el Proyecto Katana.

Como parte de esto, tengo que construir un par de URI, por ejemplo, un URI de redireccionamiento y una URL de retorno.

Otros ejemplos en Katana hacen esto concatenando partes de la solicitud actual, por ejemplo en CookieAuthenticationHandler

loginUri =
    Request.Scheme +
    Uri.SchemeDelimiter +
    Request.Host +
    Request.PathBase +
    Options.LoginPath +
    new QueryString(Options.ReturnUrlParameter, currentUri);

Mi pregunta es qué reglas gobiernan lo que termina en las dos propiedades de ruta:

OwinContext.Request.Path
OwinContext.Request.PathBase

Intenté inspeccionar estas propiedades a medida que la solicitud pasa a través de diferentes controladores en la tubería a continuación, para la solicitud:

"https://localhost/Client/login" // Where Client is a virtual directory in IIS

El resultado:

En el controlador asignado para / login, PathBase = "/ Client / Login".Pero cuando la solicitud llega al método ApplyResponseChallengeAsync en mi QuillCodeFlowHandler en el camino de regreso para la misma solicitud, PathBase = "/ Client" y Path = "/ Login".

Entonces, sin conocer las "reglas" sobre cómo se pueblan estos valores, que luego se modifican, es difícil construir URI que los usen. Si alguien puede explicar, será muy apreciado.

Un extracto de mi configuración es:

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
    AuthenticationType = CookieAuthenticationDefaults.AuthenticationType,
    LoginPath = new PathString("/Login")
});

app.UseQuillCodeFlowAuthentication(new QuillCodeFlowOptions());

app.Map("/login", map =>
{
   map.Run(async ctx =>
   {
     if (ctx.Authentication.User == null ||
     !ctx.Authentication.User.Identity.IsAuthenticated)
     {                        
       var authenticationProperties = new AuthenticationProperties();
       [...]
       ctx.Authentication.Challenge(authenticationProperties,
                                    QuillCodeFlowDefaults.AuthenticationType);  

losEspecificación OWIN da alguna explicación y el método Microsoft.Owin.Host.HttpListener.GetPathAndQuery parece estar donde las variables de ruta se establecen inicialmente.

Respuestas a la pregunta(1)

Su respuesta a la pregunta