Caixa de diálogo Suprimir autenticação NTLM

Código

Eu criei uma página de logon que combina autenticação de formulários com autenticação integrada do 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"]);
                    }
                }
            }
        }
Pergunta, questão

Isso parece funcionar razoavelmente bem até agora. Ele efetua login corretamente no usuário se ele suportar IWA. Se o navegador não estiver configurado para aceitar o IWA, desejo recorrer à autenticação de formulários. Infelizmente, o que vejo acontecendo é que, se o navegador não estiver configurado para aceitar o IWA, ele abrirá a feia caixa de diálogo de autenticação NTLM (se parece com o Diálogo Básico). Como faço para que isso não apareça?

fundo

A principal razão pela qual faço isso é porque o mesmo site pode ser acessado por usuários de desktop (no domínio) ou móveis (iPhone / Windows Phone). E o iPhone não suporta salvar senhas para a autenticação NTLM, o que é um aborrecimento para meus usuários.

Testar

Se você quiser testar esse código em seu próprio ambiente, configure um site para autenticação de formulários, verifique se a autenticação Anônima está marcada no IIS, não no IWA.

Além disso

Este código não foi totalmente testado / aprimorado. Se você é uma pessoa aleatória que tropeça na minha pergunta, não pense que ela é perfeitamente segura e depois implemente-a no seu site. Este código está nos estágios iniciais de desenvolvimento. Dito isto, se você quiser deixar um comentário dizendo como melhorá-lo, fique à vontade.

Atualizar

Atualizei meu código e minha pergunta para refletir o fato de que eu consegui obtê-lo para que, quando o usuário cancele a caixa de diálogo de autenticação feia, ele possa efetuar login com autenticação de formulários. Mas ainda quero que esse diálogo feio seja suprimido.

questionAnswers(2)

yourAnswerToTheQuestion