升级RestSharp至v110后持续出现401未授权错误,求排查
问题分析与解决方案
核心问题
你升级到RestSharp v110后,错误地将表单提交用户名密码的逻辑改成了HTTP Basic认证,这和原接口的认证方式不匹配,导致返回401。
- v107版本中,你通过
request.AddParameter将username和password作为application/x-www-form-urlencoded类型的表单参数提交给instancetoken接口; - v110版本中,你改用
HttpBasicAuthenticator,RestSharp会自动给请求添加Authorization: Basic <base64编码的用户名密码>头,而不会将参数放到表单里,接口无法识别这种认证方式,因此返回401。
修正后的代码
获取instancetoken的请求需要保持原有的表单提交方式,不需要设置Authenticator,代码调整如下:
RestClientOptions options = new RestClientOptions() { BaseUrl = new Uri(serviceUrl), MaxTimeout = cTimeout, UseDefaultCredentials = false, UserAgent = $"{Assembly.GetExecutingAssembly().GetName().Name}/{FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location).FileVersion}", Encoding = System.Text.Encoding.UTF8 }; _restClient = new RestClient(options); RestRequest request = new RestRequest("instancetoken", Method.Post); request.AddHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"); request.AddHeader("Accept", "text/plain"); // 恢复添加表单参数的逻辑 request.AddParameter(nameof(username), username); request.AddParameter(nameof(password), password); RestResponse response = await _restClient.ExecuteAsync(request).ConfigureAwait(true);
关于InstanceToken只读的处理
现在InstanceToken的setter是private,你需要在获取到有效instanceToken后,通过RestClient的实例直接修改Authenticator(RestSharp v107+中RestClient.Authenticator仍可直接设置,不受初始化Options的限制):
// 假设从response中解析得到instanceToken后赋值 InstanceToken = parsedInstanceToken; // 原代码中setter内修改Authenticator的逻辑仍然有效,无需改动: // _restClient.Authenticator = string.IsNullOrEmpty(value) ? null : (IAuthenticator)new JwtAuthenticator(value);
后续请求需要使用JWT认证时,只要_restClient.Authenticator被正确设置为JwtAuthenticator,RestSharp会自动为请求添加Authorization: Bearer <token>头。
内容的提问来源于stack exchange,提问作者Marcel Grüger
相关产品推荐
相关产品推荐

