簡體   English   中英

使用 Flurl 登錄期間缺少 cookies

[英]Missing cookies during login using Flurl

當我嘗試登錄 web 服務時,不知何故缺少一些 cookies。 缺少 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;
}

請參閱調試時看到的 cookies 的屏幕截圖。

調試 cookie 的圖像

接下來我們可以看看我使用Postman時可以看到哪個cookies。

郵遞員餅干的圖像

我需要所有 7 個 cookies 用於后續調用服務。 關於我可能做錯了什么或可能缺少什么的任何想法?

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

使用它,我可以通過在登錄任何后續調用時收到的 cookies 並且一切正常。

編輯:

再次更新代碼以使用 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;

再一次,非常感謝托德。 該解決方案目前正在生產中創造奇跡。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM