在 .NET Core 中使用 Azure AD 身份验证时如何指定自定义注销 URL

Gee*_*ekn 5 authentication azure-active-directory asp.net-core

我有一个使用工作或学校帐户(Azure AD 身份验证)的 ASP.NET Core 2.2 Web 应用程序。当我退出时,应用程序结束于

/AzureAD/帐户/注销

我希望它使用应用程序注册中指定的注销 URL 重定向回主页。请参阅下面的屏幕截图。在此处指定注销 URL 时,Azure AD 实际上会调用该页面(以清除会话数据),但最终会在 /AzureAD/Account/SignedOut 位置结束。我没有看到其他任何地方可以指定等效的注销 URL。这是使用 Azure AD 身份验证时 Visual Studio 生成的注销按钮代码。

<a asp-area="AzureAD" asp-controller="Account" asp-action="SignOut">Sign out</a>
Run Code Online (Sandbox Code Playgroud)

我还尝试将重定向直接添加到操作中。

<a asp-area="AzureAD" asp-controller="Account" asp-route-post_logout_redirect_uri="https://localhost:44381" asp-action="SignOut">Sign out</a>
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

Nan*_* Yu 11

一种方法是使用自定义URL 重写中间件通过检查路径来重定向,将以下代码放在之前app.UseMvc

app.UseRewriter(
    new RewriteOptions().Add(
        context => { if (context.HttpContext.Request.Path == "/AzureAD/Account/SignedOut")
            { context.HttpContext.Response.Redirect("/Home/Index"); }
        })
);
Run Code Online (Sandbox Code Playgroud)


小智 5

发生此问题的原因是 ASP.NET core 中嵌入的AccountController.cs返回到您提到的 URL:

        [HttpGet("{scheme?}")]
        public IActionResult SignOut([FromRoute] string scheme)
        {
            scheme = scheme ?? AzureADDefaults.AuthenticationScheme;
            var options = Options.Get(scheme);
            var callbackUrl = Url.Page("/Account/SignedOut", pageHandler: null, values: null, protocol: Request.Scheme);
            return SignOut(
                new AuthenticationProperties { RedirectUri = callbackUrl },
                options.CookieSchemeName,
                options.OpenIdConnectSchemeName);
        }
Run Code Online (Sandbox Code Playgroud)

一种解决方法是构建您自己的 AccountController,而不是使用 ASP.NET CORE 附带的默认帐户控制器,如下所示:

 public class AccountController : Controller
    {
        [HttpGet]
        public IActionResult SignIn()
        {
            var redirectUrl = Url.Action(nameof(HomeController.Index), "Home");
            return Challenge(
                new AuthenticationProperties { RedirectUri = redirectUrl },
                OpenIdConnectDefaults.AuthenticationScheme);
        }

        [HttpGet]
        public IActionResult SignOut()
        {
            var callbackUrl = Url.Action(nameof(SignedOut), "Account", values: null, protocol: Request.Scheme);
            return SignOut(
                new AuthenticationProperties { RedirectUri = callbackUrl },
                CookieAuthenticationDefaults.AuthenticationScheme,
                OpenIdConnectDefaults.AuthenticationScheme);
        }

        [HttpGet]
        public IActionResult SignedOut()
        {
            if (User.Identity.IsAuthenticated)
            {
                // Redirect to home page if the user is authenticated.
                return RedirectToAction(nameof(HomeController.Index), "Home");
            }

            return RedirectToAction(nameof(HomeController.Index), "ThePathYouWant");
        }

        [HttpGet]
        public IActionResult AccessDenied()
        {
            return View();
        }
    }
Run Code Online (Sandbox Code Playgroud)