.NET Core 2.0 MVC中IdentityServer4 Hybrid模式授权类型错误排查
解决IdentityServer4 Hybrid模式下"Invalid grant type for client: implicit"错误
嘿,我仔细看了你的问题和提供的代码,很快就找到了问题所在——你的客户端发送的是Implicit模式的请求,但IdentityServer里配置的客户端只允许Hybrid和ClientCredentials授权类型。
问题根源
从调试输出里的这段关键信息就能看出来:
"ResponseType": "id_token", "GrantType": "implicit"
你在客户端用AddOpenIdConnect的时候,默认的ResponseType是id_token(对应Implicit模式),但你的客户端在IdentityServer里配置的是AllowedGrantTypes = GrantTypes.HybridAndClientCredentials,所以IdentityServer会拒绝这个不符合授权类型的请求。
Hybrid模式要求ResponseType必须包含code(授权码),通常是code id_token或者code token,这样客户端才能先拿到授权码,再去交换访问令牌,同时获取身份令牌。
解决方案
修改客户端的AddOpenIdConnect配置,明确指定ResponseType为code id_token:
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; // 关键修改:指定Hybrid模式的ResponseType options.ResponseType = "code id_token"; options.Scope.Add("api1"); options.Scope.Add("offline_access"); });
额外验证
另外,检查你的客户端配置里的AllowAccessTokensViaBrowser = true已经正确设置了,这是Hybrid模式允许浏览器传递令牌的必要配置,你已经做对了这一步。
修改完之后重新启动客户端和IdentityServer,应该就能正常发起Hybrid模式的授权请求了。
内容的提问来源于stack exchange,提问作者Saurin Vala
相关产品推荐
相关产品推荐

