代码之家  ›  专栏  ›  技术社区  ›  Saurin Vala

AuthorizeRequestValidator:错误:客户端的授权类型无效:隐式

  •  12
  • Saurin Vala  · 技术社区  · 7 年前

    我正在尝试设置Identity Server 4 HybridAndClientCredentials 在…上NET Core 2.0 MVC。

    我正在努力克服这个错误:

    客户端类型的隐式:无效的授权

    尽管我的代码中有:

    AllowedGrantTypes = GrantTypes.HybridAndClientCredentials,
    

    我已经下载了示例quickstart,它运行正常,但我无法用我的代码找到缺少的那一行内容。

    调试输出:

    IdentityServer4.Validation.AuthorizeRequestValidator:
    Error: Invalid grant type for client: implicit
    {
      "ClientId": "consultee",
      "ClientName": "consultee Client test",
      "RedirectUri": "http://consultee.mi.local:44352/signin-oidc",
      "AllowedRedirectUris": [
        "http://consultee.mi.local:44352/signin-oidc"
      ],
      "SubjectId": "anonymous",
      "ResponseType": "id_token",
      "ResponseMode": "form_post",
      "GrantType": "implicit",
      "RequestedScopes": "",
      "State": "CfDJ8KERs5ihv_5Ll9ddYi6Nj5lkLNGQptrJwHqbSD11g27zqVxPcKxLKvbMtd5ab5LPbV15yaCNlHlzpPgRQL4R2XSue8ka_fqLBWFfXad-sRNCyY03JxgL7HZDKDrph-G4hdvRRMvBtXUc0tq2tHd7ZGX7-djehs8aHD6-P_80UfFplHCYkvARV7I64Kb5ki4cFVmLE6G8EbWIUwir6HJpkgK1CbN_IuPtBTjaLZoBOEzpxWTRVaudsD4vZFxdTv4N51ufkn8jy7GPC0pf3xCGInQpA-FziHp681qmiWbCxlp9HuAIZBem-at9dNvC29yRBw4JbcoTSrjuHkq6G6gZtXVh1YuuQYIW9R4wklmlSEX4i8kxM8zJTog98Ce3OFsYnw",
      "Raw": {
        "client_id": "consultee",
        "redirect_uri": "http://consultee.mi.local:44352/signin-oidc",
        "response_type": "id_token",
        "scope": "openid profile api1 offline_access",
        "response_mode": "form_post",
        "nonce": "636626718480261618.MDYwZjE0MjMtNzczMi00ZjQ4LTk0NWUtZjQ1ZDNjM2VjZTRhOWI0NWM0MjMtNGM3Ni00ZDA3LWIyZDctMDcwNTc3ZDU0NGYy",
        "state": "CfDJ8KERs5ihv_5Ll9ddYi6Nj5lkLNGQptrJwHqbSD11g27zqVxPcKxLKvbMtd5ab5LPbV15yaCNlHlzpPgRQL4R2XSue8ka_fqLBWFfXad-sRNCyY03JxgL7HZDKDrph-G4hdvRRMvBtXUc0tq2tHd7ZGX7-djehs8aHD6-P_80UfFplHCYkvARV7I64Kb5ki4cFVmLE6G8EbWIUwir6HJpkgK1CbN_IuPtBTjaLZoBOEzpxWTRVaudsD4vZFxdTv4N51ufkn8jy7GPC0pf3xCGInQpA-FziHp681qmiWbCxlp9HuAIZBem-at9dNvC29yRBw4JbcoTSrjuHkq6G6gZtXVh1YuuQYIW9R4wklmlSEX4i8kxM8zJTog98Ce3OFsYnw",
        "x-client-SKU": "ID_NET",
        "x-client-ver": "2.1.4.0"
      }
    }
    

    客户:

    new Client
    {
        ClientId = "consultee",
        ClientName = "consultee Client test",
        AllowedGrantTypes = GrantTypes.HybridAndClientCredentials,
    
        ClientSecrets =
        {
            new Secret("secret".Sha256())
        },
    
        RedirectUris = { "http://consultee.mi.local:44352/signin-oidc" },
        PostLogoutRedirectUris = { "http://consultee.mi.local:44352/signout-callback-oidc" },
    
        AllowedScopes =
        {
            IdentityServerConstants.StandardScopes.OpenId,
            IdentityServerConstants.StandardScopes.Profile,
            "api1"
        },
        AllowOfflineAccess = true,
        AllowAccessTokensViaBrowser = true,
    }
    

    ConfigurationService 在客户处:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();
    
        JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
    
        services.AddAuthentication(options =>
            {
                options.DefaultScheme = "Cookies";
                options.DefaultChallengeScheme = "oidc";
            })
            .AddCookie("Cookies")
            .AddOpenIdConnect("oidc", options =>
            {
                options.SignInScheme = "Cookies";
    
                options.Authority = Configuration["identityServerUri"];
                options.RequireHttpsMetadata = false;
    
                options.ClientId = "consultee";
                options.ClientSecret = "secret";
    
                options.SaveTokens = true;
                options.GetClaimsFromUserInfoEndpoint = true;
    
                options.Scope.Add("api1");
                options.Scope.Add("offline_access");
            });
    }
    

    配置服务 IdServer :

    public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc();
    
            // configure identity server with in-memory stores, keys, clients and scopes
            services.AddIdentityServer()
                .AddDeveloperSigningCredential()
                .AddInMemoryIdentityResources(Config.GetIdentityResources())
                .AddInMemoryApiResources(Config.GetApiResources())
                .AddInMemoryClients(Config.GetClients())
                .AddTestUsers(Config.GetUsers());
    
            services.AddAuthentication();
    
        }
    
    2 回复  |  直到 5 年前
        1
  •  0
  •   Ilija Pecevski    4 年前

    日志会告诉你问题出在哪里

    错误:客户端的授权类型无效:隐式

    您正在以隐式客户端身份登录。

    .AddOpenIdConnect("oidc", options =>
            {
                options.SignInScheme = "Cookies";
    
                options.Authority = Configuration["identityServerUri"];
                options.RequireHttpsMetadata = false;
    
                options.ClientId = "consultee";
                options.ClientSecret = "secret";
    
                options.SaveTokens = true;
                options.GetClaimsFromUserInfoEndpoint = true;
    
                options.Scope.Add("api1");
                options.Scope.Add("offline_access");
            });
    

    您已在identity server中配置了混合客户端

    new Client
                {
                    ClientId = "consultee",
                    ClientName = "consultee Client test",
                    AllowedGrantTypes = GrantTypes.HybridAndClientCredentials,
    
                    ClientSecrets =
                    {
                        new Secret("secret".Sha256())
                    },
    
                    RedirectUris = { "http://consultee.migrology.local:44352/signin-oidc" },
                    PostLogoutRedirectUris = { "http://consultee.migrology.local:44352/signout-callback-oidc" },
    
                    AllowedScopes =
                    {
                        IdentityServerConstants.StandardScopes.OpenId,
                        IdentityServerConstants.StandardScopes.Profile,
                        "api1"
                    },
                    AllowOfflineAccess = true,
                    AllowAccessTokensViaBrowser = true,
                }
    

    所以服务器不允许你这么做。您需要更改代码以混合方式登录,或者将客户端更改为隐式客户端。

    改用混合动力车

    为了将隐式登录更改为混合登录,您需要更改一些内容。

    • 将ClientSecret配置为与IdentityServer上的密码匹配。
    • 添加脱机访问
    • 添加作用域(api1)
    • 将ResponseType设置为 code id_token (这基本上意味着使用混合流) (你错过了这个)