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

Предположим, у нас есть приложение, которое хочет получить доступ к популярной российской социальной сети ВКонтакте и написано на C# с графическим интерфейсом WinForms. VK использует подход, аналогичный OAuth2, поэтому нам нужно открыть веб-браузер с URL-адресом авторизации vk oauth. Затем мы подписываемся на событие OnNavigated веб-браузера и ждем, пока URL-адрес не будет равен некоторому заранее определенному URL-адресу с токеном доступа в строке запроса. Теперь мы можем вызывать методы вк по полученному токену доступа, но тут происходят странные вещи: когда я пытаюсь вызвать некоторые методы вк с помощью HttpClient.GetAsync(methodUri), все идет по плану, кроме открытия ссылки из веб-браузер авторизации в системном веб-браузере. URL-адрес авторизации клиента vk выглядит как https://oauth.vk.com/authorize?client_id={clientId}&scope={scope}&redirect_uri=https://oauth.vk.com/blank.html&display={displayType}&response_type=token, URL-адрес с полученным accessToken выглядит как 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. Я понятия не имею, почему это может произойти, но я обеспокоен тем, что знак числа.

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


person Shishkin Pavel    schedule 27.03.2014    source источник
comment
Не могли бы вы найти причину? У меня такая же проблема с моим приложением.   -  person Bighted19    schedule 30.01.2020