Перенаправление после выхода из системы не работает в Asp.net Core 2 - PullRequest
0 голосов
/ 11 октября 2019

Я использую Asp.net Core 2.2 с аутентификацией AzureAD. Это работает правильно, но теперь у меня возникли проблемы при попытке реализовать URL выхода из системы.

Я попробовал следующее в моем контроллере:

[HttpGet("[action]")]
public IActionResult SignOut()
{
    return SignOut(new AuthenticationProperties { RedirectUri = Url.Action(nameof(AfterSignOut)) }, AzureADDefaults.AuthenticationScheme);
}

[HttpGet("[action]")]
[AllowAnonymous]
public IActionResult AfterSignOut()
{
    return Ok("It's working!");
}

Когда я перехожу с браузером на https://mySite/myController/SignOut, операция выхода из системы работает правильно (мой пользователь выходит из системы, а затемкогда я захожу на страницу, мне нужно снова войти в систему)

Однако проблема в том, что Я не перенаправлен на https://mySite/myController/AfterSignOut URL, как указано в AuthenticationProperties,Вместо этого /SignOut просто возвращает HTTP-код 200, и все, никуда меня не перенаправляет.

Что я здесь не так делаю?

Ответы [ 2 ]

1 голос
/ 14 октября 2019

Вы можете попробовать следующие решения, если используете Microsoft.AspNetCore.Authentication.AzureAD.UI и используете аутентификацию, например:

services.AddAuthentication(AzureADDefaults.AuthenticationScheme)
    .AddAzureAD(options => Configuration.Bind("AzureAd", options));

Метод 1:

Создайте контроллер аккаунта и напишите свой собственный знакВыходное действие:

public readonly IOptionsMonitor<AzureADOptions> Options;
public AccountController(IOptionsMonitor<AzureADOptions> options)
{
    Options = options;
}
public IActionResult SignOut()
{
    var options = Options.Get(AzureADDefaults.AuthenticationScheme);
    var callbackUrl = Url.Action(nameof(AfterSignOut), "Account", values: null, protocol: Request.Scheme);
    return SignOut(
        new AuthenticationProperties { RedirectUri = callbackUrl },
        options.CookieSchemeName,
        options.OpenIdConnectSchemeName);
}

Метод 2:

Использовать функцию выхода из библиотеки, установить новый URL перенаправления в OnSignedOutCallbackRedirect событие:

services.AddAuthentication(AzureADDefaults.AuthenticationScheme)
    .AddAzureAD(options => Configuration.Bind("AzureAd", options));

services.AddAuthentication(AzureADDefaults.AuthenticationScheme)
        .AddAzureAD(options => Configuration.Bind("AzureAd", options));
services.Configure<OpenIdConnectOptions>(AzureADDefaults.OpenIdScheme, options =>
{

    options.Events.OnSignedOutCallbackRedirect = (context) =>
    {

        context.Response.Redirect("/Account/AfterSignOut");
        context.HandleResponse();

        return Task.CompletedTask;
    };
});

И на странице, которую вы хотите выполнить, добавьте ссылку:

<a href="~/AzureAD/Account/SignOut">SignOut</a>

Метод 3:

Использовать пользовательский Перезапись URLПромежуточное программное обеспечение для перенаправления путем проверки пути, введите следующие коды перед app.UseMvc:

app.UseRewriter(
    new RewriteOptions().Add(
        context => { if (context.HttpContext.Request.Path == "/AzureAD/Account/SignedOut")
            { context.HttpContext.Response.Redirect("/Account/AfterSignOut"); }
        })
);

Также со ссылкой: <a href="~/AzureAD/Account/SignOut">SignOut</a>

0 голосов
/ 13 октября 2019

Попробуйте удалить IActionResult и сделать его пустым

public void SignOut()
{
    return SignOut(new AuthenticationProperties { RedirectUri = Url.Action(nameof(AfterSignOut)) }, AzureADDefaults.AuthenticationScheme);
}

ИЛИ

public async Task SignOut() // Not sure if it has a signout async method but use this if it does
    {
        return await SignOutAsync(new AuthenticationProperties { RedirectUri = Url.Action(nameof(AfterSignOut)) }, AzureADDefaults.AuthenticationScheme);
    }
...