Использование RemoteAuthenticationHandler CallbackPath с сопоставлением пути IApplicationBuilder - PullRequest
3 голосов
/ 05 октября 2019

Смежные вопросы

Проблема

У меня есть служба, работающая по определенному пути в домене, например, https://www.example.com/myservice. Выделен путь myservice к моей службе и другие службы имеют другие пути в том же домене. Это настроено так при запуске конфигурации:

app.Map("/myservice", builder =>
{
    builder.UseStaticFiles();
    builder.UseMvcWithDefaultRoute();
});

Я использую библиотеку, которая реализует пользовательский RemoteAuthenticationHandler. По умолчанию путь обратного вызова перенаправляется на /x-callback, в результате чего браузер пытается получить доступ к https://www.example.com/x-callback.

Поскольку мой сервис не обрабатывает URL-адреса без префикса /myservice, я получаю 404 . Изменение URL-адреса в браузере на /myservice/x-callback вручную загружает обратный вызов, и все в порядке.

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

services.AddSomething(options =>
{
    options.AddThingX((o) =>
    {
        o.CallbackPath = new PathString($"/myservice{o.CallbackPath}");
    });
});

Когда я устанавливаю путь обратного вызова, браузер пытается загрузить /myservice/x-callback. Но этот URL теперь возвращает 404 . Кажется, обработчик для обратного вызова также изменил свой URL. Изменение URL-адреса в браузере на /myservice/myservice/x-callback загружает обратный вызов, как и ожидалось.

RemoteAuthenticationHandler

Это код в обработчике, который обрабатывает вызов и использует вызов. обратный путьОн устанавливает путь обратного вызова в качестве параметра запроса для URL входа в систему.

protected override Task HandleChallengeAsync(AuthenticationProperties properties)
{
    // Add options etc
    // ...
    // ...

    // This defines the login url, with a query parameter for the CallbackPath
    var loginUrl = GetLoginUrl(loginOptions);
    Response.Redirect(loginUrl);

    return Task.CompletedTask;
}

private string GetLoginUrl(MyServiceLoginOptions loginOptions)
{
    // This is where the return url is set. The return url
    // is used after login credentials are verified.
    return $"{Options.LoginPath}" +
            $"?returnUrl={UrlEncoder.Encode(Options.CallbackPath)}" +
            $"&loginOptions={UrlEncoder.Encode(_loginOptionsProtector.Protect(loginOptions))}";
}

Контроллер входа в систему

Здесь пользователь может предоставить учетные данные и получить ихпроверено. После проверки пользователь перенаправляется на путь обратного вызова.

private async Task<ActionResult> ChallengeComplete(LoginStatusRequest request, ChallengeResponse challengeResponse)
{
    // auth logic
    // ...
    // All is fine, the users credentials have been verified. Now
    // we can redirect to the CallbackPath.
    return Ok(Response.Finished(returnUri));
}

Примечание Я мог бы сделать перезапись URL, но если это возможно, я хотел бы использовать "правильный" /myserviceпуть, чтобы избежать путаницы и, возможно, вызвать проблемы для других служб (хотя это очень маловероятно).

Вопрос

Как я могу добавить префикс пути обратного вызова к /myservice, поэтому мое приложениеможно обработать его без добавления префикса дубликата?

1 Ответ

3 голосов
/ 10 октября 2019

MapMiddleware добавляет соответствующий путь к Request.PathBase, поэтому вы можете использовать его при создании возвращаемого URL

string returnUrl = Context.Request.PathBase + Options.CallbackPath;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...