尝试连接到IdentityServer4登录页面失败

时间:2019-01-29 00:17:28

标签: oauth-2.0 identityserver4 oidc

我有一个现有的网站,希望使用OAuth2 / OIDC进行概念验证。为此,我已按照IdentityServer4快速设置指南将本地运行的IdentityServer4 MVC应用程序配置为演示OIDC服务器。可以正常工作并导航到:

http://localhost:5000/.well-known/openid-configuration

让我看看发现文件。

我在此OIDC应用程序上创建了一个伪造的登录页面,其中仅包含一个登录按钮,不需要用户凭据。

没有实际的用户数据库,我只是在对一些用户详细信息进行硬编码,以便在进行“身份验证”时返回。

在我先前存在的站点中,我添加了OWIN中间磨损并正在使用 OpenIdConnectAuthenticationOptions 配置OIDC。 clientId,范围,机密等均根据需要匹配,并且权限设置为指向本地运行的演示OIDC应用程序(http://localhost:5000)。身份验证完成后,重定向URL设置为返回到我先前存在的站点。

这一切似乎都很好,但是这是我想要达到的目标,无法正常工作。在我先前存在的站点上,当我导航到任何需要身份验证的页面时,我希望将用户重定向到在OIDC应用程序上创建的登录页面。他们单击登录按钮(无需用户详细信息),并通过身份验证并重定向回原始页面。

当前,当我导航到受保护页面时,我已成功重定向到OIDC应用程序,但我已重定向到错误页面,并且不知道为什么。错误页面没有提供任何详细信息,实际上是在应用程序中进行了硬编码。

当我查看发现文档时,我发现'authorization_endpoint'的设置被设置为:

http://localhost:5000/connect/authorize

所以我想也许我需要更改它以指向创建虚拟登录表单的主页/登录,否则我需要实际创建该连接/授权端点并将其放在此处。创建端点没有什么区别,它永远不会被点击,相反,我只是在OIDC应用程序上获得了错误页面。将其更改为家庭/登录似乎也被忽略了。

目前我不在我的主PC上,因此缺少代码段,但本质上是按照IdentityServer4快速设置指南进行的,并且OIDC应用程序确实可以正常工作。

问题是让我先前存在的网站正确重定向到登录页面。

我已经在这个问题上停留了很长一段时间,甚至想进入看到虚拟登录页面的阶段。感谢所有指针,对于缺少示例代码再次表示歉意。

更新

我通过设置openidconfiguration来显示登录表单,如下所示:

Configuration = new OpenIdConnectConfiguration()
{
 AuthorizationEndPoint = "http://localhost:5000/home/login"
}

但是,当我单击“登录”时,这并没有使我登录。在该登录操作中,我正在这样做:

await HttpContext.SignInAsync("subjectId","username", authenticationProps);

然后重定向回我现有的站点。但是,这并没有对我进行身份验证,重定向最终又被重新重定向回登录页面。

更新2

我认为重定向URI可能应该做更多的事情。目前,我正在执行以下操作:

尝试并访问受限制的页面->重定向到OIDC服务器->单击“登录”(这将成功设置主题和用户)->重定向到重定向URI,该URI立即使我反弹回OIDC服务器。

那么也许重定向URI应该用来确认登录或以其他方式进行操作?

1 个答案:

答案 0 :(得分:0)

因此,在开放ID连接协议中,授权端点用于验证作为查询参数(client_id,范围,redirect_uri等)传递的客户端信息。在您的身份验证服务器中,如果所有终结点计算机都返回表单,则不会检查所有内容。再者,验证可能很繁琐,因此将授权端点与登录端点分开可能值得思考。

Identity Server的开发人员也想到了同一件事,这就是为什么他们将您设置为端点(和端点验证)作为中间件的一部分。验证使用的是Identity Server注入的组件(主要是client_store和您定义的范围)。

框架使用客户端存储实现验证您的授权请求后,它将把用户重定向到您指定的任何登录页面。可以通过使用一个代表进行更改来指定登录页面,该代表可以作为'AddIdentityServer'的第二个参数传入(它采用IdentityServerOptions类型的内容,我们将其称为“选项”)。 。在委托中,您可以通过将“ options.UserInteraction.LoginUrl”的值更改为登录页面的网址来指定页面的登录网址。

在用户登录并在HttpContext上调用signInAsync方法之后,实际上应该重定向回传递给登录页面的查询参数,称为“ return_url”(基本上是初始授权端点)请求)。该授权端点进一步验证cookie,并将使用代码(如果使用authorization code flow)或id_token以及访问令牌(可选)将用户发送回“ redirect_uri”(如果客户端的同意设置为false) (如果使用implicit flow)。

为简化起见,假设使用隐式流程,可以在对“ redirect_uri”的请求中找到令牌,然后由您自己决定。通常,客户端会发出某种Cookie(可能包含ID或访问令牌)以标记身份提供者的成功身份验证。