使用 Flurl 登录时丢失 cookie
Missing cookies during login using Flurl
当我尝试登录 Web 服务时,某些 cookie 丢失了。缺少 cookie 的三个部分,特别是令牌和刷新令牌。但是,当我尝试使用 Postman 登录时,我得到了 cookie 的所有部分。这很奇怪,下面你可以看到我使用Flurl登录服务的代码。
private async Task<IFlurlClient> GetClientAsync()
{
var client = new FlurlClient(BaseUrl).EnableCookies();
var login = await client.Request("/Account/LogOn")
.AllowAnyHttpStatus()
.PostUrlEncodedAsync(new { Login = credentials.Username, credentials.Password});
if (!login.IsSuccessStatusCode) throw new ResponseException("Login failed");
return client;
}
查看我在调试时可以看到的 cookie 的屏幕截图。
接下来我们看看我使用Postman时能看到哪些cookies
我需要所有 7 个 cookie 才能对服务进行后续调用。知道我可能做错了什么或可能遗漏了什么吗?
当使用 Postman 时,我所做的只是一个简单的 POST 使用我拥有的凭据的表单数据。 Postman 和 Flurl 这两个调用都成功,状态代码为 200 OK,唯一不同的是收到的 cookie 值。
感谢 Todd,我通过更新到 Flurl 3.0 并更新了我的代码解决了我的问题。使用 CookieSession 的新改进版本见下文。
private async Task<CookieJar> GetCookiesAsync()
{
using var session = new CookieSession(Endpoint);
var data = new {credentials.Username, credentials.Password};
var login = await session.Request("/login").AllowAnyHttpStatus().PostUrlEncodedAsync(data);
return login.ResponseMessage.IsSuccessStatusCode ? session.Cookies : null;
}
...
var cookies = await GetCookiesAsync();
if (cookies == null) return false;
var test = await Endpoint.AppendPathSegment("/test")
.WithCookies(cookies)
.AllowAnyHttpStatus()
.PostAsync(null);
var success = test.ResponseMessage.IsSuccessStatusCode;
使用它,我可以将登录时收到的 cookie 传递给任何后续调用,并且一切正常。
编辑:
再次更新代码以使用 Todds 建议,见下文。
private async Task<CookieSession> CreateSessionAsync()
{
using var session = new CookieSession(Endpoint);
var data = new {credentials.Username, credentials.Password};
var login = await session.Request("/login").AllowAnyHttpStatus().PostUrlEncodedAsync(data);
return login.ResponseMessage.IsSuccessStatusCode ? session : null;
}
var session = await CreateSessionAsync();
if (session == null) return false;
var test = await session.Request("/test")
.AllowAnyHttpStatus()
.PostJsonAsync(new {});
return test.ResponseMessage.IsSuccessStatusCode;
再次感谢托德!该解决方案目前正在生产中创造奇迹。
当我尝试登录 Web 服务时,某些 cookie 丢失了。缺少 cookie 的三个部分,特别是令牌和刷新令牌。但是,当我尝试使用 Postman 登录时,我得到了 cookie 的所有部分。这很奇怪,下面你可以看到我使用Flurl登录服务的代码。
private async Task<IFlurlClient> GetClientAsync()
{
var client = new FlurlClient(BaseUrl).EnableCookies();
var login = await client.Request("/Account/LogOn")
.AllowAnyHttpStatus()
.PostUrlEncodedAsync(new { Login = credentials.Username, credentials.Password});
if (!login.IsSuccessStatusCode) throw new ResponseException("Login failed");
return client;
}
查看我在调试时可以看到的 cookie 的屏幕截图。
接下来我们看看我使用Postman时能看到哪些cookies
我需要所有 7 个 cookie 才能对服务进行后续调用。知道我可能做错了什么或可能遗漏了什么吗?
当使用 Postman 时,我所做的只是一个简单的 POST 使用我拥有的凭据的表单数据。 Postman 和 Flurl 这两个调用都成功,状态代码为 200 OK,唯一不同的是收到的 cookie 值。
感谢 Todd,我通过更新到 Flurl 3.0 并更新了我的代码解决了我的问题。使用 CookieSession 的新改进版本见下文。
private async Task<CookieJar> GetCookiesAsync()
{
using var session = new CookieSession(Endpoint);
var data = new {credentials.Username, credentials.Password};
var login = await session.Request("/login").AllowAnyHttpStatus().PostUrlEncodedAsync(data);
return login.ResponseMessage.IsSuccessStatusCode ? session.Cookies : null;
}
...
var cookies = await GetCookiesAsync();
if (cookies == null) return false;
var test = await Endpoint.AppendPathSegment("/test")
.WithCookies(cookies)
.AllowAnyHttpStatus()
.PostAsync(null);
var success = test.ResponseMessage.IsSuccessStatusCode;
使用它,我可以将登录时收到的 cookie 传递给任何后续调用,并且一切正常。
编辑:
再次更新代码以使用 Todds 建议,见下文。
private async Task<CookieSession> CreateSessionAsync()
{
using var session = new CookieSession(Endpoint);
var data = new {credentials.Username, credentials.Password};
var login = await session.Request("/login").AllowAnyHttpStatus().PostUrlEncodedAsync(data);
return login.ResponseMessage.IsSuccessStatusCode ? session : null;
}
var session = await CreateSessionAsync();
if (session == null) return false;
var test = await session.Request("/test")
.AllowAnyHttpStatus()
.PostJsonAsync(new {});
return test.ResponseMessage.IsSuccessStatusCode;
再次感谢托德!该解决方案目前正在生产中创造奇迹。