ServiceStack MicrosoftGraphAuthProvider客户端密钥含特殊字符时认证失败
ServiceStack MicrosoftGraphAuthProvider 客户端密钥含特殊字符导致认证失效问题
问题情况
我们使用ServiceStack的MicrosoftGraphAuthProvider实现认证已有一段时间,近期更新客户端密钥后,所有用户的登录认证均失效,登录尝试失败后浏览器会跳转到站点根目录下的/#f=Unknown地址。排查发现新密钥包含旧密钥没有的+符号,这是问题的核心起因。
查看获取访问令牌的HTTP POST请求细节:redirect_uri参数做了URL编码处理,但client_secret参数完全未编码,导致带+的密钥无法被服务端正确解析。
临时解决办法
我们在应用配置中手动对新密钥进行URL编码,将其中的+替换为%2b后,用户即可正常完成登录认证。
关于自动编码的配置支持
我们原本希望找到配置项,让MicrosoftGraphAuthProvider自动对client_secret参数做URL编码,但查看源代码后确认:当前版本的该组件没有此配置功能。相关核心代码片段如下:
protected override async Task<string> GetAccessTokenJsonAsync (string code, AuthContext ctx, CancellationToken token = default) { var accessTokenParams = $"code={code}&client_id={ConsumerKey}&client_secret={ConsumerSecret}&redirect_uri={this.CallbackUrl.UrlEncode()}&grant_type=authorization_code"; var contents = await AccessTokenUrlFilter(ctx, AccessTokenUrl) .SendStringToUrlAsync(method:HttpMethods.Post, requestBody:accessTokenParams, contentType: MimeTypes.FormUrlEncoded, token: token).ConfigAwait(); return contents; }
从代码中可以清晰看到,只有redirect_uri调用了.UrlEncode()方法进行编码处理,而client_secret直接使用了未做任何编码的ConsumerSecret原始值。
内容的提问来源于stack exchange,提问作者Joe Glover
相关产品推荐
相关产品推荐

