Thinktecture Identity server v3 Google提供商

时间:2015-02-08 17:20:02

标签: thinktecture-ident-server

我在使用Thinktecture身份服务器v3集成外部提供商,即谷歌时遇到问题。我收到以下错误:"客户端应用程序未知或未经授权。" 任何人都对这个错误有所了解。

5 个答案:

答案 0 :(得分:16)

@Whever,看起来你的客户端和服务器上的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"
    });

答案 1 :(得分:6)

我有这个问题。服务器中的RedirectUris条目几乎与客户端Startup.Configuration中的RedirectUri匹配;除了尾随斜线之外的一切。

https://localhost:46289/

不同
https://localhost:46289

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

答案 2 :(得分:2)

我一直在处理同样的问题,但只是对身份服务器进行身份验证(Google就在我的列表中接下来)。我看到了这个问题,因为客户端的范围没有在Mvc和服务器上设置。为解决此问题,我将Scopes添加到(Mvc客户端的)Startup类中,如下所示:

    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?

支持的范围内有一篇很好的SO帖子

希望有所帮助:)

答案 3 :(得分:0)

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

答案 4 :(得分:0)

在我的情况下,当我应该更改时,我不小心并且正在更改UseOpenIdConnectAuthentication下的Startup.cs中的值(这是集成Web应用程序用来连接到自身的那些)。 Clients.Get()中的值,这些是服务器已配置的允许客户端。

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

如果客户端未启用,重定向uri与列表中的不匹配(使用非区分大小写的完全匹配),如果请求的范围不在允许的范围列表中,如果请求的流,则可以获取错误与允许的内容不匹配(每个客户端只能有一个)和/或客户端ID不匹配。