почему HttpClient.GetAsync вызывает открытие ссылки в браузере?

Предположим, у нас есть приложение, которое хочет получить доступ к популярной русской социальной сети ВКонтакте и написано на C # с WinForms GUI. VK использует OAuth2-подобный подход, поэтому нам нужно открыть веб-браузер с vk oauth-авторизацией url. Затем мы подписываемся на событие OnNavigated webBrowser и ждем, пока URL не будет равен некоторому предварительно определенному URL с токеном доступа в строке запроса. Отныне мы можем вызывать методы vk, используя полученный токен доступа, но здесь происходят некоторые странные вещи: когда я пытаюсь вызвать некоторые методы vk с помощью HttpClient.GetAsync (methodUri), все идет по плану, за исключением открытия ссылки из Авторизация веб-браузера в системном веб-браузере. URL авторизации клиента вк выглядит такhttps://oauth.vk.com/authorize?client_id={clientId}&scope={scope}&redirect_uri=https://oauth.vk.com/blank.html&display={displayType}&response_type=tokenURL с полученным доступом похож наhttps://oauth.vk.com/blank.html#access_token={accessToken}&expires_in={expiresIn}&user_id={userId}Обратите внимание на знак числа вместо знака вопроса.

код в основной форме:

var authenticationForm = new AuthenticationForm();
authenticationForm.Show();
_authenticatedUser = await application.ClientAuthenticator.Authenticate(authenticationForm.GetToken);
authenticationForm.Close();

var httpClient = new HttpClient();
var request = "https://api.vk.com/method/users.get.xml?user_ids=1&fields=online";
var response = await httpClient.GetAsync(request);

Код класса authenticationForm:

public partial class AuthenticationForm : Form
{
    private readonly TaskCompletionSource<VkAccessToken> _tokenCompletitionSource = new TaskCompletionSource<VkAccessToken>();
    private Uri _redirectUri;
    public AuthenticationForm()
    {
        InitializeComponent();
    }

    public async Task<IVkAccessToken> GetToken(Uri authUri, Uri redirectUri)
    {
        authenticationBrowser.Navigate(authUri);
        _redirectUri = redirectUri;
        var token = await _tokenCompletitionSource.Task;
        return token;
    }

    private async void authenticationBrowser_Navigated(object sender, WebBrowserNavigatedEventArgs e)
    {
        if (!(_redirectUri.IsBaseOf(e.Url) && _redirectUri.AbsolutePath.Equals(e.Url.AbsolutePath))) return;
        //working with e.Url to achieve token, userId and expiresIn, creating token variable based on them
        _tokenCompletitionSource.SetResult(token);
    }
}

ClientAuthenticator.Authenticate код:

public async Task<IVkAuthenticatedUser> Authenticate(Func<Uri, Uri, Task<IVkAuthenticatedUser>> aunthenticationResultGetter)
{
    var authorizationUri =
        new Uri("https://oauth.vk.com/authorize?client_id={clientId}&scope={scope}&redirect_uri=https://oauth.vk.com/blank.html&display=page&response_type=token");
    var token = await aunthenticationResultGetter(authorizationUri, _application.Settings.RedirectUri);
    //...
    return newUserBasedOnToken;
}

после выхода (используя отладчик)var response = await httpClient.GetAsync(request); строка из основной формы, мой системный браузер открывает ссылку, какhttps://oauth.vk.com/blank.html#access_token={accessToken}&expires_in={expiresIn}&user_id={userId} - #access_token={accessToken}&expires_in={expiresIn}&user_id={userId} с последними значениями accessToken, expiresIn и userId. Да, с... - #access_token=.... в URL Я понятия не имею, почему это может произойти, но я обеспокоен тем, что знак числа.

Важное дополнение: это происходит только в том случае, если в веб-браузере нет информации о сеансе или срок его действия истек, то есть я должен ввести имя пользователя и пароль в форму входа в систему vk. если файлы cookie содержат необходимую информацию и они автоматически перенаправляются на страницу, содержащую токен в своем URL (с# перепишитесь) все работает как положено

Ответы на вопрос(0)

Ваш ответ на вопрос