Я пишу свое собственное промежуточное ПО 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, кажется, где исходные переменные пути заданы первоначально.