在哪里可以找到用于 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
- 然后select
Code Flow
在OAuth工具中,输入你的开发Azure AD客户端ID和客户端密码,然后select运行,触发重定向
- 然后向下滚动并单击
Redeem Authorization Code
,这将获得令牌,包括注销可能需要的 ID 令牌
- 然后运行一个
Logout Flow
,你需要在Azure AD中设置https://oauth.tools
作为前端通道注销URL
- 如果您无法让注销正常工作,请尝试
prompt=login
选项,这将强制重新登录
问答
所以 OIDC 注销有效,但第二个因素生存时间无效。这超出了 OIDC 规范,可能不受代码影响。在新的隐身浏览器 window 中尝试一下,看看是否必须输入第二个因素。如果是这样,那么它将是一个 cookie,如果您跟踪 HTTP 流量,您可能能够识别它。在某处寻找控制此设置的配置设置 - 类似于 this article 中的 Curity TTL 设置。如果没有这样的设置,那么它可能不在您的控制范围内。
剩余的浏览器会话。在某些方面,如果用户让其他人使用他们的桌面会话,那么所有的赌注都会落空。你可能太在意这个了。只是旨在与其他应用程序一样好。例如,您是否像 Office 365 本身、Gmail 等一样安全?
默认情况下(没有 post 注销重定向 URI)用户被转回 Azure 登录屏幕,这通常不是用户想要的。相反,post 注销登录屏幕让您的应用程序控制用户体验。一个常见的选项是只显示类似 You are signed out, click here to log back in
的内容。在 C# 网站中,这只是 return 浏览器视图。
安全性是其中一种,一旦设置好,您就会忘记它,直到出现问题。我有一个将 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
- 然后select
Code Flow
在OAuth工具中,输入你的开发Azure AD客户端ID和客户端密码,然后select运行,触发重定向 - 然后向下滚动并单击
Redeem Authorization Code
,这将获得令牌,包括注销可能需要的 ID 令牌 - 然后运行一个
Logout Flow
,你需要在Azure AD中设置https://oauth.tools
作为前端通道注销URL - 如果您无法让注销正常工作,请尝试
prompt=login
选项,这将强制重新登录
问答
所以 OIDC 注销有效,但第二个因素生存时间无效。这超出了 OIDC 规范,可能不受代码影响。在新的隐身浏览器 window 中尝试一下,看看是否必须输入第二个因素。如果是这样,那么它将是一个 cookie,如果您跟踪 HTTP 流量,您可能能够识别它。在某处寻找控制此设置的配置设置 - 类似于 this article 中的 Curity TTL 设置。如果没有这样的设置,那么它可能不在您的控制范围内。
剩余的浏览器会话。在某些方面,如果用户让其他人使用他们的桌面会话,那么所有的赌注都会落空。你可能太在意这个了。只是旨在与其他应用程序一样好。例如,您是否像 Office 365 本身、Gmail 等一样安全?
默认情况下(没有 post 注销重定向 URI)用户被转回 Azure 登录屏幕,这通常不是用户想要的。相反,post 注销登录屏幕让您的应用程序控制用户体验。一个常见的选项是只显示类似
You are signed out, click here to log back in
的内容。在 C# 网站中,这只是 return 浏览器视图。