UI 和服务访问的 OpenId Connect 身份验证

OpenId Connect authentication for UI and service access

我们正在构建一个使用 IdentityServer3 OpenID Connect authentication 来保护其 RESTful APIs 的应用程序。

对于 UI 访问,我们使用在 IS3 注册的隐式流客户端。我们的 Startup class 设置 OIDC Owin Security module 连接到 IS3。一切都很好。

此应用程序的下一个要求是我们的 REST API 不仅可以通过 Web UI 访问,还可以从其他服务访问。 Client Credential Flow 似乎符合要求。关键是让服务通过重定向到 IS3 登录页面并在那里填写用户名/密码来联系我们的 REST API 是不切实际的。客户端凭据流客户端直接在 IS3 服务器获取令牌,然后对我们的 REST API.

执行其操作

启动 class 看起来像这样:

internal class Startup
{
    public void Configuration(IAppBuilder app)
    {
        // The Bearer token authentication is used for service to service
        // REST API access (also for testing purposes)
        app.UseIdentityServerBearerTokenAuthentication(new IdentityServerBearerTokenAuthenticationOptions
        {
            Authority = ConfigurationManager.AppSettings["IdmUrl"],
            NameClaimType = "client_id",
            RoleClaimType = "client_role"
            // ...
        });

        // OIDC authentication is used for UI access
        app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
        {
            Authority = ConfigurationManager.AppSettings["IdmUrl"],
            // ...
        }
    }
}

它适用于两种情况,人类通过浏览器访问它并因此使用隐式流以及使用客户端凭据流的服务。但是,如果服务在客户端凭证流中使用的令牌过期,请求将再次重定向到 IS3 服务器。我们希望它 return 401 error 以便客户端知道它需要再次获取新令牌。

你能想出一种方法来组合这两个流程,使它们能够很好地协同工作吗?

要允许 401 未经授权但也允许使用 UI 的 302 重定向,您需要实施 solution like the one here(来自身份服务器作者之一)。

在这种情况下,通过添加对 AJAX 的检测来调整 app.UseCookieAuthentication() 设置,并仅在检测到 AJAX 请求时重定向到登录页面。您应该能够根据自己的需要进行调整。