簡體   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