Como são preenchidas OwinContext.Request.Path e PathBase?

Estou escrevendo meu próprio middleware OWIN para o fluxo de código de autorização OpenID Connect, com base em outros exemplos no Projeto Katana.

Como parte disso, tenho que construir alguns URIs, por exemplo, um URI de redirecionamento e um URL de retorno.

Outros exemplos no Katana fazem isso concatenando partes da solicitação atual, por exemplo, em CookieAuthenticationHandler

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

Minha pergunta é quais regras governam o que acaba nas duas propriedades do caminho:

OwinContext.Request.Path
OwinContext.Request.PathBase

Tentei inspecionar essas propriedades à medida que a solicitação passa por diferentes manipuladores no pipeline abaixo, para a solicitação:

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

O resultado:

No manipulador mapeado para / login, o PathBase = "/ Client / Login".Mas quando a solicitação chega ao método ApplyResponseChallengeAsync no meu QuillCodeFlowHandler no caminho de volta para a mesma solicitação, PathBase = "/ Client" e Path = "/ Login".

Portanto, sem conhecer as "regras" de como esses valores são preenchidos e alterados posteriormente, é difícil construir URIs usando-os. Se alguém puder explicar, será muito apreciado.

Um extrato da minha configuração é:

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

oEspecificação OWIN fornece algumas explicações e o método Microsoft.Owin.Host.HttpListener.GetPathAndQuery parece estar onde as variáveis de caminho são definidas inicialmente.