Подавить диалог аутентификации 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.
ТакжеЭтот код не полностью протестирован / уточнен. Если вы случайный человек, который натыкается на мой вопрос, не думайте, что он совершенно безопасен, а затем используйте его на своем сайте. Этот код находится на ранней стадии разработки. Тем не менее, если вы хотите оставить комментарий о том, как его улучшить, не стесняйтесь.
ОбновитьЯ обновил свой код и вопрос, чтобы отразить тот факт, что мне удалось его получить, чтобы, когда пользователь отменяет уродливое диалоговое окно аутентификации, он мог войти в систему с помощью аутентификации форм. Но я все еще хочу, чтобы этот уродливый диалог был подавлен.