Подавить диалог аутентификации NTLM

Код

Я создал страницу входа, которая сочетает в себе проверку подлинности с помощью форм и встроенную проверку подлинности Windows.

public partial class Login : System.Web.UI.Page
        {
        // http://www.innovation.ch/personal/ronald/ntlm.html
        // http://curl.cofman.dk/rfc/ntlm.html
        // http://blogs.msdn.com/b/chiranth/archive/2013/09/21/ntlm-want-to-know-how-it-works.aspx
        protected void Page_Load(object sender, EventArgs e)
            {
            if (!IsPostBack)
                {
                if (Request.Headers["Authorization"].IsNullOrEmpty())
                    {
                    Response.StatusCode = 401;
                    Response.AddHeader("WWW-Authenticate", "NTLM");
                    Email.SendMailToDebugger("Auth", "No Auth");
                    //Response.End();
                    }
                else if (Request.Headers["Authorization"].StartsWith("Negotiate"))
                    {
                    Response.StatusCode = 401;
                    Response.AddHeader("WWW-Authenticate", "NTLM");
                    Email.SendMailToDebugger("Auth", "Negotiate Auth");
                    Response.End();
                    }
                else if (Request.Headers["Authorization"].StartsWith("NTLM"))
                    {
                    string base64text = Request.Headers["Authorization"].Remove(0, 5); //Remove NTLM<space>
                    byte[] bytes = Convert.FromBase64String(base64text);
                    byte typebyte = bytes[8];

                    if (typebyte.ToString("X2") == "01") //type 1 message received
                        {
                        //send type 2 message
                        List<byte> responsebytes = new List<byte> { 0x4e, 0x54, 0x4c, 0x4d, 0x53, 0x53, 0x50, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 00, 0x02, 0x02, 0x00, 0x00, 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef };
                        string type2message = Convert.ToBase64String(responsebytes.ToArray());
                        Response.StatusCode = 401;
                        Response.AddHeader("WWW-Authenticate", "NTLM " + type2message);
                        Email.SendMailToDebugger("Auth", "Type 1 Received, Type 2 Sent");
                        Response.End();
                        }
                    else if (typebyte.ToString("X2") == "03") //type3 message received
                        {
                        var dv = Database.GetDataView("select UPPER('termana'||REPLACE(P.EMAIL,'@termana.com','')||p.init) displayname, 'termana\\'||REPLACE(P.EMAIL,'@termana.com','') username  from tercons.phonebook p where P.COMPANY_ID=40");
                        string username = ""; //magic to get the username from the type3 response
                        Email.SendMailToDebugger("Auth", "Type 3 Received, logging in: " + username);
                        FormsAuthentication.RedirectFromLoginPage(username, false);
                        }
                    else
                        {
                        Email.SendMailToDebugger("Auth", "Unknown Type Received");
                        }
                    }
                else
                    {
                    Email.SendMailToDebugger("Auth", "Unknown Authentication Received: " + Request.Headers["Authorization"]);
                    }
                }
            }
        }
Вопрос

Это, кажется, работает довольно хорошо до сих пор. Он правильно регистрирует пользователя, если он поддерживает IWA. Если их браузер не настроен на прием IWA, я хочу вернуться к проверке подлинности с помощью форм. К сожалению, я вижу, что, если браузер не настроен на прием IWA, он открывает уродливое диалоговое окно аутентификации NTLM (похоже на «Основной диалог»). Как мне заставить это не появляться?

Фон

Основная причина, по которой я это делаю, заключается в том, что к одному и тому же сайту можно получить доступ через настольных пользователей (в домене) или с мобильных устройств (iPhone / Windows Phone). И iPhone не поддерживает сохранение паролей для аутентификации NTLM, что является проблемой для моих пользователей.

Тестировать

Если вы хотите протестировать этот код в собственной среде, настройте сайт для проверки подлинности с помощью форм, убедитесь, что анонимная проверка подлинности включена в IIS, а не в IWA.

Также

Этот код не полностью протестирован / уточнен. Если вы случайный человек, который натыкается на мой вопрос, не думайте, что он совершенно безопасен, а затем используйте его на своем сайте. Этот код находится на ранней стадии разработки. Тем не менее, если вы хотите оставить комментарий о том, как его улучшить, не стесняйтесь.

Обновить

Я обновил свой код и вопрос, чтобы отразить тот факт, что мне удалось его получить, чтобы, когда пользователь отменяет уродливое диалоговое окно аутентификации, он мог войти в систему с помощью аутентификации форм. Но я все еще хочу, чтобы этот уродливый диалог был подавлен.

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

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