Oauth 2.0 尝试连接到IdentityServer4登录页失败

Oauth 2.0 尝试连接到IdentityServer4登录页失败,oauth-2.0,identityserver4,openid-connect,Oauth 2.0,Identityserver4,Openid Connect,我有一个现有的网站,我想用OAuth2/OIDC做一个概念验证。为此,我已经按照IdentityServer4快速安装指南配置了一个本地运行的IdentityServer4 MVC应用程序作为我的演示OIDC服务器。这很好,可以导航到: http://localhost:5000/.well-known/openid-configuration 让我看看发现文档 我在这个OIDC应用程序上创建了一个假登录页面,它只包含一个登录按钮,不需要用户凭据 没有实际的用户数据库,我只是对一些用户详细信息

我有一个现有的网站,我想用OAuth2/OIDC做一个概念验证。为此,我已经按照IdentityServer4快速安装指南配置了一个本地运行的IdentityServer4 MVC应用程序作为我的演示OIDC服务器。这很好,可以导航到:

http://localhost:5000/.well-known/openid-configuration
让我看看发现文档

我在这个OIDC应用程序上创建了一个假登录页面,它只包含一个登录按钮,不需要用户凭据

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

在我之前存在的站点中,我添加了OWIN middle wear,并正在使用OpenIdConnectAuthenticationOptions配置OIDC。clientId、scopes、secret等都符合要求,权限设置为指向我在本地运行的演示OIDC应用()。一旦身份验证完成,重定向url将设置为返回到我先前存在的站点

这一切看起来都很好,但这是我想要实现的目标,但却无法实现。在我现有的网站上,当我导航到任何需要身份验证的页面时,我希望用户被重定向到我在OIDC应用程序上创建的登录页面。它们单击“登录”按钮(不需要用户详细信息),经过身份验证并重定向回原始页面

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

当我查看发现文档时,我看到“authorization_endpoint”的设置设置为:

http://localhost:5000/connect/authorize
所以我想也许我需要将其更改为指向Home/Login,这是我创建虚拟登录表单的地方,或者我需要实际创建连接/授权端点并将表单放在那里。创建端点没有任何区别,它从来不会被击中,相反,我只会在我的OIDC应用程序上看到错误页面。将其更改为home/login也会被忽略

我目前不在我的主PC上,因此缺少代码片段,但基本上是按照IdentityServer4快速安装指南进行设置的,并且OIDC应用程序似乎正在工作

问题是如何让我预先存在的站点正确重定向到登录页面

我已经在这上面呆了很长一段时间了,我甚至想看到虚拟登录页面。感谢您的指点,并再次对缺少示例代码表示歉意

更新

通过如下设置openidconfiguration,我获得了登录表单:

Configuration = new OpenIdConnectConfiguration()
{
 AuthorizationEndPoint = "http://localhost:5000/home/login"
}
但是,当我单击“登录”时,这不会让我登录。在登录操作中,我正在执行以下操作:

await HttpContext.SignInAsync("subjectId","username", authenticationProps);
然后重定向回我现有的站点。但是,它没有对我进行身份验证,重定向最终被重定向回登录页面

更新2

我认为重定向URI应该做更多的事情。目前我做了以下工作:

尝试访问受限页面->重定向到OIDC服务器->单击登录(这将成功设置主题和用户)->Am重定向到重定向URI,这会立即将我返回到OIDC服务器


因此,重定向URI可能是为了确认登录或执行其他操作?

因此,在开放id连接协议中,授权端点用于验证作为查询参数传递的客户端信息(客户端id、作用域、重定向URI等)。在身份验证服务器中,如果端点只返回一个表单,则不会检查所有这些内容。同样,验证可能会很繁琐,因此将authorize端点与用于登录的端点分开可能值得考虑

Identity Server的开发人员也有同样的想法,这就是为什么他们将端点(和端点验证)设置为中间件的一部分。验证使用注入的组件(主要是客户端存储和您定义的作用域)供Identity Server使用

在框架使用客户端存储实现验证您的授权请求之后,它将用户重定向到您指定的登录页面。可以通过使用委托更改登录页面来指定登录页面,该委托可以作为“AddIdentityServer”的第二个参数传入(该参数采用我们将称为“选项”的某种类型)。在委托中,您可以通过将“options.UserInteraction.LoginUrl”的值更改为登录页面的url来指定页面的登录url

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


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

我认为您需要为控制器登录表单的操作设置帐户/登录,以使其在默认情况下正常工作。我已用更多详细信息更新了问题。我不确定您出现错误的原因。使用或Fiddler在HTTP级别观察流量可能是一个好主意。来自授权服务器的HTTP响应应提供更多信息。把它贴在这里会有帮助的。但我可以肯定的是,将AuthorizationEndPoint设置为您自己的:“是错误的。它需要与发现文档中定义的授权端点相同