[英]Automatic Redirect on Authorize Failure Using IIS Automatic Authentication with ASP.NET Core MVC
我正在ASP.Net Core MVC中创建一个网站,并使用IIS的自动身份验证通过活动目录自动验证公司的用户。 目前,它正在按预期的方式工作,但是, 如果用户无法通过IIS进行验证 , 我希望将其重定向到登录页面。 我看过其他文章,描述了使用普通身份验证Cookie而不是使用自动身份验证cookie时如何执行此操作。
这是我当前的Configure Services方法:
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication(IISDefaults.AuthenticationScheme);
services.Configure<CookiePolicyOptions>(options =>
{
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.Configure<IISServerOptions>(options =>
{
options.AutomaticAuthentication = true;
});
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}
因此,目前它已成功锁定了标记为[Authorize]的页面上没有AD授权的用户,我只想将锁定的流量重定向到标记为[AllowAnonymous]的另一个页面。 有没有办法修改services.Configure方法? 到目前为止,我什么都没看到。
您使用的是Windows身份验证 。 对AutomaticAuthentication
的引用仅告诉IIS使用用户详细信息自动设置HttpContext.User
(否则,即使身份验证成功,也不会设置)。
您真正要寻找的是两种身份验证方法:对于具有AD帐户的人(使用这些帐户登录),请使用Windows身份验证自动登录。 否则,显示登录屏幕,您可以自己处理身份验证。
我之前在ASP.NET MVC中已经做到这一点,但是我还没有在ASP.NET Core中做到这一点。 我将描述我所做的事情,但这并不是一个完整的解决方案,因为ASP.NET Core缺少一部分。
使用cookie作为主要身份验证方法。 像平常一样设置它,并使用一个登录页面来验证凭据并设置cookie 。
设置一个使用Windows身份验证的控制器操作(例如/Login/SSO
)。 我在web.config中使用了location
标记来做到这一点。 在ASP.NET Core中,这仍然可能是相同的,我只是不太确定您如何在代码中进行了解。 但是web.config中的部分看起来像这样:
<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身份验证尝试重定向-但我不记得了)
花哨的技巧在登录页面上。 默认情况下隐藏页面上的所有内容。 在页面加载时,向/Login/SSO
发出AJAX请求。 如果成功,则用户已登录,您可以将他们(通过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身份验证进行身份验证的用户将访问该站点,将其重定向到登录页面,该登录页面将执行成功的AJAX请求以创建其Cookie,然后将他们重定向回到所需的原始页面。 相当无缝。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.