身份服务器 4 returns 在生产中注销时出现 404 错误是有原因的

Is there a reason why identity server 4 returns a 404 error when logging out in production

我目前在实施身份服务器 4 时遇到生产问题。

当我执行登录时,我被重定向到身份服务器,我可以毫无问题地进行身份验证。

当我尝试注销时出现了问题。我被重定向到 "connect/endsession" 端点上的身份服务器并返回 404。

我什至尝试了所有浏览器,都是同样的问题。 生产:MS 服务器 2012、iis 8 和 .net 核心 2.1

这里有一些代码示例:

在我的客户端启动中:

services.AddAuthentication(option => {
            option.DefaultScheme = "Cookies";
            option.DefaultChallengeScheme = "oidc";


        }).AddCookie("Cookies")
        .AddOpenIdConnect("oidc", options => {
            options.SignInScheme = "Cookies";
            options.Authority = Configuration["Authentication:Authority"]; // identity.example.com
            options.RequireHttpsMetadata = false;
            options.ClientId = Configuration["Authentication:ClientId"]; //example.mvc
            options.SaveTokens = true;
            options.GetClaimsFromUserInfoEndpoint = true;
            options.ClientSecret = Configuration["Authentication:ClientSecret"] //!@examplepassword@! ;

        });

在帐户控制器中我有这个注销方法

 public async Task Logout()
    {

        await HttpContext.SignOutAsync("Cookies");
        await HttpContext.SignOutAsync("oidc");


    }

在身份服务器中

我的客户端存储实现从 json 文件中提取一个客户端对象并正确映射它,我知道它有效。

{
  "Enable": true,
  "ClientId": "example.mvc",
  "ClientName": "example enterprise ",
  "RedirectUris": [ "http://www.example.com/signin-oidc" ],
  "PostLogoutRedirectUris": [ "http://www.example.com/signout-callback-oidc" ],
  "AllowAccessTokensViaBrowser": true,
  "RequireConsent": false,
  "ClientSecret": "!@examplepassword@!",
  "AllowedScopes": [ "openid", "profile", "email" ],
  "GrantType": "implicitandclientcredentials"
} 

单击注销时,我希望永久注销。但出于某种原因,我收到 404 错误。

不确定我是否必须添加一个具有 [Route("/signout-callback-oidc")] 的控制器,但出于某种原因我无法在生产环境中使用注销。

有趣的是,它在我的电脑上本地运行,我尝试调试它。

所以结果是 iis 中的最大 url 长度限制,当命中时,返回 404。我修改了 startup.cs 文件中的 .AddOpenIdConnect 方法并添加到一行。

.AddOpenIdConnect("oidc", options => {
            options.SignInScheme = "Cookies";
            options.Authority = Configuration["Authentication:Authority"];
            options.RequireHttpsMetadata = false;
            options.ClientId = Configuration["Authentication:ClientId"];
            options.SaveTokens = true;
            options.GetClaimsFromUserInfoEndpoint = true;
            options.ClientSecret = Configuration["Authentication:ClientSecret"];
            options.AuthenticationMethod = OpenIdConnectRedirectBehavior.FormPost; // adding this line fixed my problem. and i can now logout permanently. 

        });