#restsharp
Вопрос:
Я преобразую консольное клиентское приложение API, созданное в .Net 4.7.2, в консольное приложение .Net Core 5.0. Я чувствовал, что могу превратить все в .Net Core 5.0 (большая часть кода была вырезана и скопирована), и приложение запускается, но каждый мой запрос возвращается несанкционированным.
Вот мой РестКлиент
Uri basePath = new Uri("lt;urlgt;"); string userName = "lt;userNamegt;"; string password = "lt;passwordgt;"; RestClient restClient = new RestClient(); restClient = new RestClient(basePath); restClient.Authenticator = new Authenticator(basePath, userName, password); restClient.FollowRedirects = true; string EmpId = "lt;employeeIdgt;"; RestRequest restRequest = new RestRequest("Employees/{EmpId}", Method.GET); restRequest.AddUrlSegment("EmpId", EmpId ); var response = restClient.Executelt;Payloadlt;Employeegt;gt;(restRequest);
ответ.Данные всегда равны нулю и являются ответом.Код состояния = Неавторизованный
Вот мой аутентификатор
public class Authenticator : IAuthenticator { private readonly CredentialCache credentials = new CredentialCache(); public Authenticator(Uri loginServerUrl, string username, string password) { if (loginServerUrl == null) { throw new ArgumentNullException(nameof(loginServerUrl)); } registerAuthenticationModule(loginServerUrl); credentials.Add(loginServerUrl, AuthenticationModule.API_AUTHENTICATION, new NetworkCredential(username, password, loginServerUrl.Host)); } private static AuthenticationModule registerAuthenticationModule(Uri loginServerUrl) { IEnumerator registeredModules = AuthenticationManager.RegisteredModules; AuthenticationModule authenticationModule; while (registeredModules.MoveNext()) { object current = registeredModules.Current; if (current is AuthenticationModule) { authenticationModule = (AuthenticationModule)current; if (authenticationModule.LoginServerUrl.Equals(loginServerUrl)) { return authenticationModule; } } } authenticationModule = new AuthenticationModule(loginServerUrl); AuthenticationManager.Register(authenticationModule); return authenticationModule; } public void Authenticate(IRestClient client, IRestRequest request) { request.Credentials = credentials; } }
Вот мой модуль аутентификации
public class AuthenticationModule : IAuthenticationModule { internal const string API_AUTHENTICATION = "ApiAuthentication"; private readonly CredentialCache credentialCache = new CredentialCache(); private readonly Uri loginServerUrl; internal CredentialCache CredentialCache { get { return credentialCache; } } internal Uri LoginServerUrl { get { return loginServerUrl; } } internal AuthenticationModule(Uri loginServerurl) { if (loginServerurl == null) { throw new ArgumentNullException(nameof(loginServerurl)); } loginServerUrl = loginServerurl; } public Authorization Authenticate(string challenge, WebRequest request, ICredentials credentials) { Authorization result = null; if (request == null || credentials == null) { result = null; } else { NetworkCredential creds = credentials.GetCredential(LoginServerUrl, API_AUTHENTICATION); if (creds == null) { return null; } string token = Convert.ToBase64String(Encoding.UTF8.GetBytes(string.Format("{0}:{1}", creds.UserName, creds.Password))); result = new Authorization(string.Format("Basic {0}", token)); } return result; } public string AuthenticationType { get { return API_AUTHENTICATION; } } public bool CanPreAuthenticate { get { return false; } } public Authorization PreAuthenticate(WebRequest request, ICredentials credentials) { return null; } }
Я знаю, что в прошлом у меня были проблемы с некоторыми сторонними API-интерфейсами клиента REST, которые не включают учетные данные для запросов, полученных в результате ответа на перенаправление с сервера. Вот почему я использую RestSharp. Кто-нибудь может мне здесь помочь?
Спасибо!