繁体   English   中英

使用IIS自动身份验证和ASP.NET Core MVC在授权失败时自动重定向

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM