使用Flurl登录期间缺少cookie

时间:2020-08-12 11:08:55

标签: c# asp.net-core cookies .net-core 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。

image of debug cookies

接下来,我们可以查看使用邮递员时可以看到哪些cookie。

image of postman cookies

我需要所有7个cookie才能随后调用该服务。关于我可能做错了什么或可能遗失了什么的任何想法?

使用Postman时,我所要做的只是使用我拥有的凭据使用表格数据进行简单的POST。 Postman和Flurl这两个调用都成功,并且状态码为200 OK,不同之处仅在于接收到的Cookie值。

1 个答案:

答案 0 :(得分:1)

感谢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;

再次感谢您,托德!此解决方案目前正在生产中发挥作用。