【问题标题】:Where can I find a code sample for OpenId Connect sign out for c#?在哪里可以找到 OpenId Connect 注销 c# 的代码示例?
【发布时间】:2022-01-18 21:17:40
【问题描述】:

安全性是其中之一,一旦您设置了它,您就会忘记它,直到某些东西不起作用。我有一个使用 OpenId Connect 和 Azure 的 .Net Core 应用程序。登录工作正常,但几天前我们注意到注销无法正常工作。您可以退出应用程序,然后直接再次登录而无需输入凭据。所以,我环顾四周,发现清除cookie和会话还不够好,您需要转到“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"];

            });

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

【问题讨论】:

  • 这应该不难弄清楚,但我仍然找不到一个简单的代码示例。我看过很多文档,以及很多实际上不起作用的示例,因为它们是针对产品的。

标签: c# openid-connect openid logout


【解决方案1】:

RP 发起注销

这主要是发送带有这些参数的标准消息的情况。如果我没记错的话,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 Connectmax-age 参数。然后您会在ID 令牌中获得auth_time 声明。在 auth_time 过期后的下一次重定向中,如果需要,您可以使用此数据发送prompt=login 参数,以强制用户重新进行身份验证。 this post 中描述了执行此操作的 .NET 方法。

更新

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

测试选项

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

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

问答

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

  2. 剩余的浏览器会话。在某些方面,如果用户让其他人使用他们的桌面会话,那么所有的赌注都没有了。你可能会对此过于挂念。只是旨在与其他应用程序一样好。例如,您与 Office 365 本身、Gmail 等一样安全吗?

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

【讨论】:

  • 首先,感谢您的回复!我将看看 C# 选项。在我能够找到的文档中,它谈到仅清除事物还不够,您必须将用户引导到 Azure 中的注销请求,这与您所说的相符。但是你包括了一些我以前没有见过的额外部分。在 Azure 应用注册中,我只看到 Front Channel Logout URL 的选项。我看过另一个领域的屏幕截图,但我没有看到。另外,我不明白术语 RP 和 OP 是什么意思。远程进程?
  • 我同意你的观点,即 .Net 语法不直观。它使它看起来很简单。
  • 这些都不起作用。问题是我们将 Office 365 与 Microsoft Authenticator 应用程序一起使用。因此,例如,我可以单击注销按钮,网站会告诉我它已将我注销。但是当我关闭站点(本地开发)并重新启动应用程序时,它会立即让我登录。
  • 好吧,我在上面添加了一些进一步的注释,以响应您的 cmets。我将首先关注消息,而不是 C# 代码,希望以上说明能够为您提供一些故障排除选项。
  • 哇!非常感谢您的补充说明。我经历了 OAuth 工具流程,我觉得它很熟悉。它奏效了,也没有奏效。我第一次登录应用程序并输入密码等时,它会触发 Microsoft Authenticator 的第二个因素身份验证。然后我需要进入我的手机并批准该请求。正如我所看到的那样,我可以注销,但是当我重新登录时,绕过了 2 因素身份验证,我刚刚登录。我的密码已经在那里。
猜你喜欢
  • 2012-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-12
  • 1970-01-01
  • 2011-01-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多