【问题标题】:Thinktecture Identity server v3 Google providerThinktecture Identity server v3 Google 提供商
【发布时间】:2015-04-08 10:23:48
【问题描述】:

我在集成外部提供商时遇到问题,即 Google 与 Thinktecture 身份服务器 v3。我收到以下错误:“客户端应用程序未知或未授权。” 有没有人知道这个错误。

【问题讨论】:

  • 我也有同样的问题

标签: thinktecture-ident-server


【解决方案1】:

@Whoever,看起来您在客户端和服务器中的 RedirectUri 值不匹配。

客户端启动中的 RedirectUri 属性定义了在身份服务器进行身份验证后将调用的 URI。服务器配置中的 RedirectUris 定义了可以请求身份验证的允许 URI 列表。因此,客户端启动 RedirectUri 必须包含在服务器的 RedirectUris 列表中。

看起来您客户端的 RedirectUri 当前指向服务器的 URI。您的客户端是否在端口 46289 上运行?如果是这样,请尝试将客户端启动中的 RedirectUri 属性的值更改为https://localhost:46289。您可能还想尝试修改服务器的 redirectUris 值以使用 https 而不是 http,假设您的客户端确实可以通过 https 访问。

服务器客户端存储:

public static IEnumerable<Client> Get() 
{
    return new[] {
         new Client {
             Enabled = true,
             ClientName = "MVC Client",
             ClientId = "mvc",
             Flow = Flows.Implicit,

             RedirectUris = new List<string>{
                 "https://localhost:46289/"  // client home url

客户端启动:

public void Configuration(IAppBuilder app)
{
    ConfigureAuth(app);
    app.UseCookieAuthentication(new CookieAuthenticationOptions {
        AuthenticationType = "Cookies"        
    });

    app.UseOpenIdConnectAuthentication(
        new OpenIdConnectAuthenticationOptions {
            Authority = "https://localhost:44300/identity",
            ClientId = "mvc",
            RedirectUri = "https://localhost:46289/", //must be in server's Client.RedirectUris
            ResponseType = "id_token",

            SignInAsAuthenticationType = "Cookies"
    });

【讨论】:

  • 都试过了,改了重定向uri和https,还是一样的错误。还注意到在添加客户端相关的 nuget 包时,它进行了很多在 Thinktecture 下载的 MVC 示例中没有的修改。不知道他们为什么将服务器和客户端代码放在同一个示例中,我什至不确定服务器在哪里结束,客户端从哪里开始,可能在其他地方错过了一些重要的东西。我想我必须回到没有 MVC 的更简单的例子重新开始。感谢您的帮助。
  • 您查看过identityserver.github.io/Documentation/docs/overview/… 的示例吗?这在同一解决方案中有一个自托管服务器、一个 Web api 和一个控制台。我认为通过从两个“入门”中的每一个中选择一个项目,我得到了我当前的示例(一个自托管服务器和一个 IIS 中的 mvc 网站,每个都在自己的 .sln 中) identityserver.github.io/Documentation/docs 列出的示例,然后进行一些小的调整,例如关闭服务器端的 SSL,并如上所述调整服务器/客户端配置中的 URI。
  • 是的,我只是一步一步完成了。它具有服务器、Web API 和客户端。但是在MVC例子中,它从服务器跳转,添加cookie和openidconnect包,然后在about控制器中添加[授权]。我不知道服务器在哪里结束,客户端从哪里开始。我将服务器部分留在一个空项目中,然后创建了一个单独的 MVC 项目并从 cookie/openid 步骤开始,并得到了客户端未知错误。不确定我是否正确理解了整个事情。我现在要回去检查 Web 托管服务器示例,也许还有一些单独的客户端。似乎有很多东西要学。
  • @Whoever - 你有没有找到解决方案?只是遇到了同样的问题。
  • @MattWoodward 已经有一段时间了,当我问这个时忘记了确切的情况。你是在谷歌集成方面遇到了这个问题,还是只是想把 id server 从客户端中分离出来?
【解决方案2】:

我遇到了这个问题。服务器中的 RedirectUris 条目几乎与客户端 Startup.Configuration 中的 RedirectUri 匹配;除了尾部的斜线。

https://localhost:46289/

不一样

https://localhost:46289

当我添加斜线时,我的登录页面出现了。

【讨论】:

  • 我犯了同样的错误... :)
  • 匹配是精确的字符串匹配(不区分大小写),而不是使用 Uri 类更聪明的匹配!
【解决方案3】:

我一直在解决同样的问题,但只是针对 Identity Server 进行身份验证(Google 是我接下来要解决的问题)。我看到了这个问题,因为客户端的范围没有在 Mvc 和服务器上设置。为了解决这个问题,我将作用域添加到(Mvc 客户端的)启动类中,如下所示:

    public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
        {
            Authority = "https://localhost:44301",
            Scope = "openid profile email roles",
            ClientId = "mvc",
            RedirectUri = "https://localhost:44300/",
            ResponseType = "id_token",

            SignInAsAuthenticationType = "Cookies"
        });

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

..并且也在服务器的客户端列表中:

    public static class Clients
{
    public static IEnumerable<Client> Get()
    {
        return new[]
        {
            new Client
            {
                Enabled = true,
                ClientName = "MVC Client",
                ClientId = "mvc",
                Flow = Flows.Implicit,
                RequireConsent = true,
                RedirectUris = new List<string>
                {
                    "https://localhost:44300/"
                },
                PostLogoutRedirectUris = new List<string>
                {
                    "https://localhost:44300/"
                },
                AllowedScopes = new List<string> {
                    Constants.StandardScopes.OpenId,
                    Constants.StandardScopes.Profile,
                    Constants.StandardScopes.Email,
                    Constants.StandardScopes.Roles
                }
            }
        };
    }
}

关于 OP 向 Google 提出的问题,可能值得在 Google Developer Console 中检查您的范围是否与您的应用设置所支持的范围相关。 Where can I find a list of scopes for Google's OAuth 2.0 API?

上有一篇关于受支持范围的好帖子

希望有帮助:)

【讨论】:

    【解决方案4】:

    看起来客户端(您希望可以使用 Google 登录的应用程序)未在客户端商店中注册。能否请您出示一下您的启动配置?

    【讨论】:

    • 不是我的问题,但我确实有同样的错误。将我的代码粘贴在下面,因为注释无法容纳它。
    【解决方案5】:

    就我而言,当我应该更改Clients.Get() 中的值,即服务器已配置的允许客户端。

    一旦我修复了这些问题,我就能够将客户端和服务器分成两个应用程序,只有一些 NuGet 包和客户端应用程序中的 UseCookieAuthentication/UseOpenIdConnectAuthentication。

    如果客户端未启用,重定向 uri 与列表中的一个不匹配(使用不区分大小写的精确匹配),如果请求的范围不在允许的范围列表中,如果请求的流,您会收到错误与允许的不匹配(每个客户端只能有一个)和/或客户端 ID 不匹配。

    【讨论】:

      猜你喜欢
      • 2015-03-24
      • 1970-01-01
      • 2015-02-12
      • 1970-01-01
      • 2014-04-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-29
      • 2015-11-18
      相关资源
      最近更新 更多