gpt4 book ai didi

c# - 是否需要 Cookie 中间件来粘合 OAuth2 和 OpenIdConnect?

转载 作者:太空宇宙 更新时间:2023-11-03 14:56:16 27 4
gpt4 key购买 nike

我们的应用程序包括:

  • 前端,这是一个使用 OAuth2 在我们的后端进行身份验证的 SPA
  • 后端,这是一个 ASP.NET OWIN 应用程序,充当 OAuth2 服务器和 OpenID 连接客户端
  • 第 3 方 OpenID 连接提供商

因此,当未经身份验证的用户浏览到 SPA 时,SPA 会与我们的后端启动 OAuth2 隐式流,这会导致重定向到显示登录表单的 OpenID 连接提供程序。用户登录后,JWT token 将发布到我们后端的 OIDC 回调端点,这会触发将身份存储在 cookie 中的 cookie 中间件,并重定向到 OAuth2 授权端点,该端点通过返回访问 token 恢复隐式流在 URL 片段中。

为此,我目前使用 OWIN Cookie 中间件将 OpenID Connect 中间件与 OAuth2 中间件粘合在一起,其中 cookie 过期时间非常短,因为唯一的目的是将身份从 OpenID 连接回调传递给 OAuth2 授权端点。因此,我想问问是否有一种方法可以做到同样的事情,但没有 cookie 中间件,因为在这个设置中感觉有点多余。

不管怎样,这是我们的中间件配置:

// Clear default inbound claim mappings, otherwise the 'sub' claim is mapped to a ClaimTypes.NameIdentifier which is not what we want
JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();

app.UseJwtBearerAuthentication(new JwtBearerAuthenticationOptions
{
AuthenticationMode = AuthenticationMode.Active,
AllowedAudiences = new[] { options.JwtOptions.Audience },
IssuerSecurityKeyProviders = new[] { new X509CertificateSecurityKeyProvider(options.JwtOptions.Issuer, options.JwtOptions.SigningCertificate) }
});

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationMode = AuthenticationMode.Passive,
CookieName = "Brownie",
CookieHttpOnly = true,
CookieSecure = CookieSecureOption.Always,
ExpireTimeSpan = TimeSpan.FromMinutes(1),
SlidingExpiration = false
});

app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
{
AuthenticationMode = AuthenticationMode.Active,
AuthenticationType = Constants.OpenIdConnectAuthenticationType,
MetadataAddress = options.OpenIdConnectOptions.MetadataAddress,
ClientId = options.OpenIdConnectOptions.ClientId,
ClientSecret = options.OpenIdConnectOptions.ClientSecret,
Notifications = new OpenIdConnectNotificationHandlers(options),
RedirectUri = new Uri(options.ApplicationUrl, options.OpenIdConnectOptions.CallbackPath.ToString()).ToString(),
ResponseType = "code id_token",
Scope = "openid profile offline_access",
SignInAsAuthenticationType = CookieAuthenticationDefaults.AuthenticationType
});

app.UseOAuthAuthorizationServer(new OAuthAuthorizationServerOptions
{
AuthenticationMode = AuthenticationMode.Active,
AuthenticationType = Constants.OAuth2AuthenticationType,
AuthorizeEndpointPath = options.AuthorizeEndpoint,
TokenEndpointPath = options.TokenEndpoint,
AllowInsecureHttp = false,
AccessTokenExpireTimeSpan = options.JwtOptions.TokenLifetime,
AccessTokenFormat = new JwtTokenFormat(options.JwtOptions),
Provider = new OAuth2AuthorizationServerProvider(context => context.GetAutofacLifetimeScope().Resolve<IClientRepository>())
});

Constants.OAuth2AuthenticationType 传递给 OpenID Connect 中间件的 SignInAsAuthenticationType 不起作用。

最佳答案

一般来说,这是最佳实践,并按照 OpenID Connect Basic Client Implementer's Guide 1.0 - draft 37 Section 2.1.1.1. Request Parameters 中所述使用“state”参数。

“推荐。用于维护请求和回调之间状态的不透明值。通常,跨站点请求伪造(CSRF、XSRF)缓解是通过将此参数的值与浏览器 cookie 加密绑定(bind)来完成的。”

关于c# - 是否需要 Cookie 中间件来粘合 OAuth2 和 OpenIdConnect?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48893969/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com