簡體   English   中英

ASP.NET Core,定義為OpenId SignedOutCallbackPath時不觸發路由

[英]ASP.NET Core, route is not triggered when defined as OpenId SignedOutCallbackPath

我有這個 controller

    [Route("Authentication")]
    public class AuthenticationController : Controller
    {

而這個動作

        [HttpGet("SignOut")]
        public async Task<IActionResult> SignOut([FromQuery] string sid)
        {
            await ControllerContext.HttpContext.SignOutAsync(Microsoft.AspNetCore.Authentication.OpenIdConnect.OpenIdConnectDefaults.AuthenticationScheme);
            await ControllerContext.HttpContext.SignOutAsync(Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationDefaults.AuthenticationScheme);


            return View();

這按預期工作。

但是,當我為具有相同路由的 OpenId 身份驗證配置 SignedOutCallbackPath 時,它不再起作用。 我的 controller 的構造函數未被調用,操作未命中,瀏覽器中的結果是帶有 html/head/body 的空白頁面(代碼 200),但全部為空,與任何模板或視圖都不匹配。

            services.AddAuthentication(options =>
            {
                options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
            })
            .AddCookie(options =>
            {
                options.Cookie.HttpOnly = true;
            })
            .AddOpenIdConnect(options =>
            {
                options.SignedOutCallbackPath = "/Authentication/SignOut";

SignedOutCallbackPath 不應該是我自己的觀點嗎?

OpenID Connect 身份驗證方案中的回調路徑是用於 OpenID Connect 協議身份驗證流程的內部路徑。 其中有以下三種:

  • CallbackPath – 身份驗證提供程序在進行身份驗證時CallbackPath的路徑。
  • SignedOutCallbackPath – 身份驗證提供程序在注銷后回發的路徑。
  • RemoteSignOutPath – 身份驗證提供程序在第三方應用程序遠程注銷后回發的路徑。

從我的解釋中可以看出,這些都是身份驗證提供程序使用的 URL:它們是身份驗證流程的一部分,不能由您的用戶直接使用。 您也無需擔心處理這些事情。 當身份驗證中間件運行時,OpenID Connect 身份驗證處理程序將自動響應這些請求。

這意味着當您將回調路徑更改為某個作為控制器操作之一的路徑的路徑時,身份驗證中間件將在您的控制器參與之前處理該請求。 這是設計使然,因此您無需擔心這些路由,因為它們主要是內部路由。

如果您不能或不想使用默認值,您只能選擇更改這些路徑。

現在,我能想到兩件可能的事情,你本來打算改變的:

  • SignedOutRedirectUri :這是用戶在注銷過程完成后被重定向到的 URL。 這基本上允許您將用戶發送到某個視圖,例如一條消息“您已成功退出”,以顯示退出已完成。

    您還可以將其設置為可以傳遞給SignOutAsyncAuthenticationPropertiesSignOutAsync

  • CookieAuthenticationOptions.LogoutPath :這是配置為用戶可以轉到以退出應用程序的實際 URL 的 URL。 但這並沒有真正產生太大的影響。

否則,將用戶發送到您的/Authentication/SignOut URL /Authentication/SignOut您。 例如,您可以在布局中放置一個按鈕,以便始終為用戶提供注銷功能。

您的 Action 需要未通過您的回調傳遞的參數,該參數似乎也未在操作中使用,因此您可以省略該參數或將其設為可選

[HttpGet("SignOut")]
public async Task<IActionResult> SignOut()
{
            await ControllerContext.HttpContext.SignOutAsync(Microsoft.AspNetCore.Authentication.OpenIdConnect.OpenIdConnectDefaults.AuthenticationScheme);
            await ControllerContext.HttpContext.SignOutAsync(Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationDefaults.AuthenticationScheme);

            return View();
}

對於 Azure AD,我發現了這個注銷后重定向行為:

  • 它不適用於租戶的根帳戶,即我的個人帳戶,它創建了 Azure 訂閱。
  • 但它適用於我在訂閱中創建的新帳戶。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM