Смежные вопросы
Проблема
У меня есть служба, работающая по определенному пути в домене, например, 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
, поэтому мое приложениеможно обработать его без добавления префикса дубликата?