Как заполняются OwinContext.Request.Path и PathBase?

Я пишу свое собственное промежуточное ПО OWIN для потока кода авторизации OpenID Connect, основанного на других примерах в Проекте Katana.

В рамках этого я должен создать пару URI, например, URI перенаправления и URL-адрес возврата.

Другие примеры в Katana делают это путем объединения частей из текущего запроса, например, в CookieAuthenticationHandler

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

Мой вопрос заключается в том, какие правила определяют то, что заканчивается в двух свойствах пути:

OwinContext.Request.Path
OwinContext.Request.PathBase

Я попытался проверить эти свойства, поскольку запрос проходит через различные обработчики в конвейере ниже, для запроса:

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

Результат:

В сопоставленном обработчике для / login, PathBase = "/ Client / Login".Но когда запрос попадает в метод ApplyResponseChallengeAsync в моем QuillCodeFlowHandler на пути возврата для того же запроса, PathBase = "/ Client" и Path = "/ Login".

Таким образом, не зная «правил» для того, как эти значения заполняются, а затем изменяются, трудно создать URI, используя их. Если кто-нибудь может объяснить, будет высоко ценится.

Выдержка из моего конфига:

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

OWIN спецификация дает некоторое объяснение, и метод Microsoft.Owin.Host.HttpListener.GetPathAndQuery, кажется, является тем, где переменные пути установлены первоначально.

Ответы на вопрос(1)

Ваш ответ на вопрос