Caixa de diálogo Suprimir autenticação NTLM
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ãoIsso 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?
fundoA 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.
TestarSe 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 dissoEste 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.
AtualizarAtualizei 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.