身份服务器 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.
});
我目前在实施身份服务器 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.
});