使用 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;

再次感谢托德!该解决方案目前正在生产中创造奇迹。