Unterdrücken Sie den NTLM-Authentifizierungsdialog

Code

Ich habe eine Anmeldeseite erstellt, die die Formularauthentifizierung mit der integrierten Windows-Authentifizierung kombiniert.

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"]);
                    }
                }
            }
        }
Frage

Dies scheint bisher ziemlich gut zu funktionieren. Der Benutzer wird ordnungsgemäß angemeldet, wenn er IWA unterstützt. Wenn ihr Browser nicht für die Annahme von IWA konfiguriert ist, möchte ich auf die Formularauthentifizierung zurückgreifen. Leider sehe ich, dass, wenn der Browser nicht so konfiguriert ist, dass er IWA akzeptiert, der hässliche NTLM-Authentifizierungsdialog angezeigt wird (sieht aus wie der Basisdialog). Wie komme ich dazu, dass das nicht erscheint?

Hintergrund

Der Hauptgrund, warum ich das tue, ist, dass auf dieselbe Site über Desktop-Benutzer (in der Domäne) oder über Mobilgeräte (iPhone / Windows Phone) zugegriffen werden kann. Und das iPhone unterstützt das Speichern von Kennwörtern für die NTLM-Authentifizierung nicht, was für meine Benutzer ein Ärger ist.

Zu testen

Wenn Sie diesen Code in Ihrer eigenen Umgebung testen möchten, konfigurieren Sie eine Site für die Formularauthentifizierung, und stellen Sie sicher, dass die anonyme Authentifizierung in IIS und nicht in IWA aktiviert ist.

Ebenfalls

Dieser Code ist nicht vollständig getestet / ausgearbeitet. Wenn Sie eine zufällige Person sind, die über meine Frage stolpert, gehen Sie nicht davon aus, dass sie absolut sicher ist, und implementieren Sie sie dann auf Ihrer Website. Dieser Code befindet sich in der frühen Entwicklungsphase. Das heißt, wenn Sie einen Kommentar hinterlassen möchten, der besagt, wie Sie ihn verbessern können, fühlen Sie sich frei.

Aktualisieren

Ich habe meinen Code und meine Frage aktualisiert, um der Tatsache Rechnung zu tragen, dass ich es geschafft habe, dass der Benutzer sich mit Formularauthentifizierung anmelden kann, wenn er das hässliche Authentifizierungsdialogfeld abbricht. Aber ich möchte immer noch, dass dieser hässliche Dialog unterdrückt wird.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage