HttpListener AuthenticationSchemes.Basic utf-8
От: vaa  
Дата: 17.06.22 08:25
Оценка:
Как заставить это чудо прочитать имя и пароль пользователя в utf-8?
декодируется неверно. видимо считает что только ascii возможны.
      
                if (ctx.User.Identity is HttpListenerBasicIdentity basicIdentity)
                {
                    var login = ctx.Request.Headers["Authorization"].Split(' ');
                    if (!login[0].Equals("Basic", StringComparison.OrdinalIgnoreCase))
                        throw new Exception("ожидается Basic Authorization");

                    string[] userNameAndPassword = UTF8Encoding.UTF8.GetString(Convert.FromBase64String(login[1])).Split(new char[] { ':' }, 2); //<= по-русски
            _ = ctx.User.Identity.Username <= по-китайcки !?

        }


тут https://referencesource.microsoft.com/#System/net/System/Net/WebHeaderCollection.cs,d814c1f1ccad7126
если я правильно понял кодировка не учитывается

Приехали!
Нашел баг-репорт https://social.msdn.microsoft.com/Forums/Windowsapps/en-US/d119226e-2ce8-4b8c-9101-17e75b8443de/uwp-how-to-switch-basic-auth-password-encoding-to-utf8?forum=wpdevelop
поскольку сотрудники МС не знают, видимо никак.
применив https://2cyr.com/decode/?lang=ru выяснил что кодировка Windows-1251 применилась к utf-8.
по исходникам видно, что используется какой-то хитрый алгоритм для определения наличия utf-8 кодировки у хедеров.
что странно. ведь по спеке utf-8 можно явно задать в требовании к авторизации(правда клиент не обязан выполнять это требование).
но в реализации listener нет способа это задать, только костылить свою реализацию.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Отредактировано 21.06.2022 1:21 Разраб . Предыдущая версия . Еще …
Отредактировано 17.06.2022 13:43 Разраб . Предыдущая версия .
Отредактировано 17.06.2022 9:42 Разраб . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.