【问题标题】:ASP.NET MVC OpenId Mixed with AjaxASP.NET MVC OpenId 与 Ajax 混合
【发布时间】:2021-05-24 21:41:46
【问题描述】:

我有一个 MVC 应用程序,我正在从“专有”身份验证机制迁移到 OpenID Connect

这是配置

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
    AuthenticationType = "Cookies",
    CookieName = "AuthCookieName"
});

app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
{
    AuthenticationType = "OpenId",
    ClientId = "myClient",
    Authority = "https://mykeycloakinstance...",
    Scope = OpenIdConnectScope.OpenIdProfile,
    ResponseType = "code id_token token",
    TokenValidationParameters = new TokenValidationParameters()
    {
        ValidateIssuer = true,
    },
    Notifications = new OpenIdConnectAuthenticationNotifications
    {
        RedirectToIdentityProvider = async n =>
        {
            n.ProtocolMessage.RedirectUri = n.Request.Uri.AbsoluteUri;
        }
    },
    SaveTokens = true,
    SignInAsAuthenticationType = "Cookies"
});

该应用程序主要使用 MVC 范例(即服务器从数据库中提取信息并将它们注入到cshtml 视图文件中)

但一些页面/视图也使用 AJAX(即调用返回 JSON 数据并在客户端呈现 JSON 的端点),这就是我的问题所在。

我的访问令牌每 1 分钟刷新一次(我知道我可以更改该数字,但我更愿意将其保持在相对较低的水平)。 应用程序的“MVC”部分通过快速将用户重定向到 IDP 并返回来完美处理它

但是执行 Ajax 请求的页面在第一分钟有效(只要访问令牌有效),然后中断并开始返回 302(AJAX 请求尝试重定向到 IDP)

刷新页面后,会话刷新和 AJAX 请求再次开始工作(至少在下一分钟),但有些页面是“长期存在的”,因此希望用户在while 是不可接受的。

如何使 AJAX 请求正常工作?我应该考虑在我的客户端中使用隐式流吗?如果是这样,我将如何处理“MVC”部分?

【问题讨论】:

    标签: asp.net asp.net-mvc asp.net-mvc-4 openid-connect


    【解决方案1】:

    一种选择是在后端处理所有令牌,因此客户端(浏览器)不需要处理令牌刷新。

    OAuth 2.1 中已弃用的隐式流程不应再用于新项目。

    两个值得一读的链接是:

    如果您使用的是 ASP.NET Core,则可以使用 IdentityModel 库及其内置的访问令牌管理。它可以使用您的刷新令牌自动刷新访问令牌。 https://identitymodel.readthedocs.io/en/latest/aspnetcore/web.html

    【讨论】:

    • 这就是我已经在做的事情。我现在正在使用隐式流程。所有令牌都在服务器上处理,客户端使用会话 cookie 与服务器通信。问题是,正如我在帖子中所说,cookie 仅在用户刷新页面时才会刷新,因此,大量使用 AJAX 且不依赖用户刷新的页面会在 cookie/访问令牌过期后中断。我可以通过隐藏 iFrame 来缓解它,该 iFrame 会定期将用户重定向到 IDP,这反过来会刷新 cookie,但我不确定这是否真的是最佳实践......
    • 更新了我的答案。对于新的开发,您应该考虑将授权代码流与 PKCE 一起使用,因为这比隐式流更安全。您还可以进行更改,以使会话令牌持续更长时间?
    • 我正在使用 .NET Framework(旧版应用程序)。另外,我可以延长访问令牌的寿命,但这只会延迟问题
    • 根据我的经验,隐藏 iframe 是刷新 cookie 和/或令牌的完美可行解决方案。
    猜你喜欢
    • 1970-01-01
    • 2010-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-07
    • 1970-01-01
    • 2017-04-09
    相关资源
    最近更新 更多