在哪里可以找到用于 C# 的 OpenId Connect 注销的代码示例?

Where can I find a code sample for OpenId Connect sign out for c#?

安全性是其中一种,一旦设置好,您就会忘记它,直到出现问题。我有一个将 OpenId Connect 与 Azure 结合使用的 .Net Core 应用程序。登录工作正常,但几天前我们注意到注销不工作。您可以注销该应用程序,但随后无需输入凭据即可直接再次登录。所以,我一直在四处寻找,发现清除cookies和会话还不够好,你需要去“end_session_endpoint”来真正清除凭据。我已经查看了很多地方,但找不到一个简单的代码示例来说明如何做到这一点。而且我试过的代码示例似乎都不行。当我在本地 运行 时,我可以注销并且它说它注销了我,但是当我再次启动应用程序时,我会立即自动登录。我理解这个概念,我只是不知道该怎么做。下面是我的身份验证在 Startup.cs 文件中的样子:

services.AddAuthentication(options =>
            {

            })
            .AddCookie()
            .AddOpenIdConnect(options =>
            {
                options.Authority = Configuration["Authentication:Microsoft:OAuth"];
                options.RequireHttpsMetadata = true;
                options.ResponseType = OpenIdConnectResponseType.CodeIdToken;
                options.UsePkce = false;
                options.Scope.Clear();
                options.Scope.Add("openid");
                options.Scope.Add("email");
                options.SaveTokens = true;
                options.CallbackPath = new PathString(Configuration["Authentication:Microsoft:Callback"]);
                options.TokenValidationParameters = new TokenValidationParameters
                {
                    ValidateIssuer = false,                      
                };

                // MetadataAddress represents the Active Directory instance used to authenticate users.
                options.MetadataAddress = Configuration["Authentication:Microsoft:Meta"];

                options.ClientId = Configuration["Authentication:Microsoft:ApplicationId"];
                options.ClientSecret = Configuration["Authentication:Microsoft:Password"];

            });

有人有这方面的直接代码示例吗?

RP 发起注销

这主要是使用这些发送标准消息的情况 parameters.If 我没记错,Azure 可能需要其中的第三个才能成功注销。

  • client_id
  • post_logout_redirect_uri
  • id_token_hint

例子

这是发送此类请求的 C# example。它使用较旧的 .Net 框架,但应该很容易理解。

在 .Net Core 中,您可以在 OIDC 属性中设置 SignedOutCallbackPath,它必须与针对 Azure AD 中的客户端注册的 post_logout_redirect_uri 匹配。然后您可以在控制器中调用此代码,它应该会发送标准消息。

await HttpContext.SignoutAsync():

我个人觉得这个 .NET 语法和 C# 层有点不直观,但最终它只是标准消息的包装。

我的 Azure SPA example 进行了 RP 启动的注销,我可以确认上述参数在 Azure AD 中工作正常。

高级选项

有时注销可能是获得最佳可用性行为的一个非常棘手的领域,具体取决于提供商。如果以后有用,另一种选择是使用 OpenID Connect during sign in. You then get an auth_time claim in the ID token. On the next redirect after auth_time has expired you can use this data to send a prompt=login parameter if required, to force the user to re-authenticate. The .NET way to do this is described in .

中的 max-age 参数

更新

这是我的 SPA 配置,使用 post 注销重定向 URI,以检查您自己的配置。 RP(依赖方)是您的 C# Web 应用程序,OP(openid 连接提供程序)是 Azure AD(我从来不喜欢这种类型的术语)。注销机制只专注于删除 Azure AD 设置的 SSO cookie。不过,Azure AD 注销行为可能不容易完全控制,因为 OAuth 技术中的注销有时会变得复杂并涉及多个应用程序。

测试选项

您可以尝试的一个选项是使用 OAuth Tools 登录和注销,这对于解决此类问题很有用,而无需编写代码。一旦你在这里得到正确的行为,你就会更清楚你需要编码的内容:

  • 首先找到您的 OpenID Connect 元数据 URL - 这是 my URL
  • 下一步 select Add Environment,给它起一个像 my 这样的名字并输入元数据 URL - 然后确保这个环境是 selected
  • https://oauth.tools/callback/code 添加到 Azure AD 作为重定向 URI
  • 然后selectCode Flow在OAuth工具中,输入你的开发Azure AD客户端ID和客户端密码,然后select运行,触发重定向
  • 然后向下滚动并单击 Redeem Authorization Code,这将获得令牌,包括注销可能需要的 ID 令牌
  • 然后运行一个Logout Flow,你需要在Azure AD中设置https://oauth.tools作为前端通道注销URL
  • 如果您无法让注销正常工作,请尝试 prompt=login 选项,这将强制重新登录

问答

  1. 所以 OIDC 注销有效,但第二个因素生存时间无效。这超出了 OIDC 规范,可能不受代码影响。在新的隐身浏览器 window 中尝试一下,看看是否必须输入第二个因素。如果是这样,那么它将是一个 cookie,如果您跟踪 HTTP 流量,您可能能够识别它。在某处寻找控制此设置的配置设置 - 类似于 this article 中的 Curity TTL 设置。如果没有这样的设置,那么它可能不在您的控制范围内。

  2. 剩余的浏览器会话。在某些方面,如果用户让其他人使用他们的桌面会话,那么所有的赌注都会落空。你可能太在意这个了。只是旨在与其他应用程序一样好。例如,您是否像 Office 365 本身、Gmail 等一样安全?

  3. 默认情况下(没有 post 注销重定向 URI)用户被转回 Azure 登录屏幕,这通常不是用户想要的。相反,post 注销登录屏幕让您的应用程序控制用户体验。一个常见的选项是只显示类似 You are signed out, click here to log back in 的内容。在 C# 网站中,这只是 return 浏览器视图。