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.