你正在使用的是什么 Windows身份验证 。引用 AutomaticAuthentication 只是告诉IIS自动设置 HttpContext.User 使用用户详细信息(否则,即使身份验证成功,也不会)。
AutomaticAuthentication
HttpContext.User
您正在寻找的是两种身份验证方法:对于拥有AD帐户(使用这些帐户登录)的人员,请使用Windows身份验证自动登录。否则,显示登录屏幕,您可以自己处理身份验证。
我之前在ASP.NET MVC中已经完成了这个,但我还没有(在ASP.NET Core中)完成它。我将描述我所做的,但这不是一个完整的解决方案,因为ASP.NET Core缺少一个部分。
使用cookies 为您的主要身份验证方法。像往常一样设置它,使用登录页面验证凭据和 设置cookie 。
设置一个控制器动作(比方说, /Login/SSO )使用Windows身份验证。我是用a做的 location web.config中的标记。在ASP.NET Core中,这仍然可能是相同的,我只是不完全确定你如何在代码中接受它。但是web.config中的部分看起来像这样:
/Login/SSO
location
<location path="Login/SSO"> <system.webServer> <security> <authentication> <windowsAuthentication enabled="true"/> <anonymousAuthentication enabled="false"/> </authentication> </security> </system.webServer> <system.web> <authorization> <allow users="?"/> </authorization> </system.web> </location>
在该操作的代码中,假设您可以弄清楚如何从Windows身份验证中获取用户名,您可以设置cookie并返回200 OK(您不需要返回视图)。如果Windows身份验证失败,IIS将自行返回401。 (我觉得 <allow users="?"/> 只是为了防止cookie身份验证尝试重定向 - 但我不记得了)
<allow users="?"/>
花哨的技巧在登录页面上。默认情况下隐藏页面上的所有内容。在页面加载时,执行AJAX请求 /Login/SSO 。如果成功,则用户登录并且您可以将它们(通过javascript)转发到他们想要的页面。如果失败,只显示登录页面的内容。这看起来像这样(假设你正在使用jQuery):
$(function() { $.get("@Url.Action("SSO", "Login")").done(function(data) { //success! forward to the page they want window.location.replace(returnUrl); }).fail(function() { //failed - show login prompt $("#loginBox").show(); }); });
通过此设置,可以使用Windows身份验证进行身份验证的用户将访问该站点,重定向到登录页面,登录页面会成功创建他们的cookie的AJAX请求,然后将他们重定向回他们想要的原始页面。很无缝。