gpt4 book ai didi

c# - RestSharp Authenticator 跟随 302 重定向

转载 作者:太空狗 更新时间:2023-10-30 01:34:58 25 4
gpt4 key购买 nike

我正在尝试使用 RestSharp 向 API 发出请求。通过将请求重定向到登录服务器、使用基本凭据进行身份验证、获取 cookie,然后重定向回 API,此 API 得到保护。恐怕我无法控制这个。

所以请求的顺序是:

Request                                            Response
---------------------------------------------------------------------------------
1. GET http api server 302 Found to login server
2. GET https login server 401 Unauthorized
3. GET https login server with basic credentials 302 Found to api server with cookies
4. GET http api server with cookies 200 OK

我正在尝试使用 RestSharp 执行此操作。这是我的代码:

var client = new RestClient("api server")
{
Authenticator = new HttpBasicAuthenticator("username", "password")
};
var request = new RestRequest("api path", Method.GET);
var result = client.Execute<TResult>(request).Data;

授权 header 仅在第一次请求时发送。它不遵循任何重定向。

有没有办法让 RestSharp 仅将凭据发送到登录服务器?

最佳答案

它不是一直都在吗?发布到堆栈溢出后,您会找到解决方案。

https://github.com/restsharp/RestSharp/issues/414

我必须构建自定义 System.Net.IAuthenticationModule,而不是在 RestClient 上使用 IAuthenticator。这是我的解决方案:

我的 RestSharp 身份验证器

public class MyAuthenticator : IAuthenticator
{
private readonly CredentialCache _credentials = new CredentialCache();

public MyAuthenticator(Uri loginServerUrl, string username, string password)
{
if (loginServerUrl == null)
{
throw new ArgumentNullException("loginServerUrl");
}

__registerAuthenticationModule(loginServerUrl);
_credentials.Add(loginServerUrl, MyAuthenticationModule.TheAuthenticationType, new NetworkCredential(username, password, loginServerUrl.Host));
}

private static MyAuthenticationModule __registerAuthenticationModule(Uri loginServerUrl)
{
IEnumerator registeredModules = AuthenticationManager.RegisteredModules;
MyAuthenticationModule authenticationModule;

while (registeredModules.MoveNext())
{
object current = registeredModules.Current;
if (current is MyAuthenticationModule)
{
authenticationModule = (MyAuthenticationModule)current;
if (authenticationModule.LoginServerUrl.Equals(loginServerUrl))
{
return authenticationModule;
}
}
}

authenticationModule = new MyAuthenticationModule(loginServerUrl);
AuthenticationManager.Register(authenticationModule);
return authenticationModule;
}

public void Authenticate(IRestClient client, IRestRequest request)
{
request.Credentials = _credentials;
}
}

我的 .NET 身份验证模块

public class MyAuthenticationModule : IAuthenticationModule
{
internal const string TheAuthenticationType = "MyAuthentication";

private readonly CredentialCache _credentialCache = new CredentialCache();
private readonly Uri _loginServerUrl;

internal CredentialCache CredentialCache
{
get
{
return _credentialCache;
}
}

internal Uri LoginServerUrl
{
get
{
return _loginServerUrl;
}
}

internal MyAuthenticationModule(Uri loginServerurl)
{
if (loginServerurl == null)
{
throw new ArgumentNullException("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, TheAuthenticationType);
if (creds == null)
{
return null;
}

ICredentialPolicy policy = AuthenticationManager.CredentialPolicy;
if (policy != null && !policy.ShouldSendCredential(LoginServerUrl, request, creds, this))
{
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 TheAuthenticationType; }
}

public bool CanPreAuthenticate
{
get { return false; }
}

public Authorization PreAuthenticate(WebRequest request, ICredentials credentials)
{
return null;
}
}

像这样添加到 RestSharp 客户端

var client = new RestClient(commonApiUrl)
{
Authenticator = new MyAuthenticator(loginServerUrl, username, password)
};

关于c# - RestSharp Authenticator 跟随 302 重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28195208/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com