簡體   English   中英

.Net Core 2 OpenID Connect身份驗證和多個身份

[英].Net Core 2 OpenID Connect Authentication and multiple Identities

我仍在學習Identity Framework,並且在嘗試在我的.Net Core 2 MVC應用程序中設置身份驗證時非常迷失。 感謝我提供任何建議,因為我什至不確定自己在做什么。


我需要集成OpenID Connect身份提供程序進行身份驗證,並使用輔助數據源進行授權 除名稱聲明外,我不方便使用OIDC IdP的任何聲明。 其余的用戶聲明必須來自輔助數據源(通過自定義UserStoreUser實體連接到Identity Framework)。

我正在使用OpenId Connect提供程序來處理身份驗證。 這工作正常,並為我提供了第一個身份(我只能使用一個索賠)。 當我需要獲取用戶的第二個Identity並將其添加到主體,並將其設置為默認Identity時,我的困惑就開始了。 此第二Identity提供了所有用戶聲明,包括角色。

我對身份框架的理解是,我應該有一個具有兩個身份的單個ClaimsPrincipal ,以便可以插入身份框架的其余部分。 但是,對於兩個身份,默認的ClaimsPrincipal將自動選擇第一個Identity(這是我不能使用的身份),因此,似乎我應該創建一個自定義ClaimsPrincipal並設置PrimaryIdentitySelector以使我的第二個Identity為主要身份。

public class MyClaimsPrincipal : ClaimsPrincipal
{
    private static readonly Func<IEnumerable<ClaimsIdentity>, ClaimsIdentity> IdentitySelector = SelectPrimaryIdentity;

    /// <summary>
    /// This method iterates through the collection of ClaimsIdentities and chooses an identity as the primary.
    /// </summary>
    private static ClaimsIdentity SelectPrimaryIdentity(IEnumerable<ClaimsIdentity> identities)
    {
        // Find and return the second identity
    }
}

從OIDC IdP獲得經過驗證的令牌后,我將獲取第二個身份,創建一個新的MyClaimsPrincipal,然后將兩個身份添加到新的主體中。 之后,我不確定該如何處理新的校長。

我試圖通過SignInManager登錄用戶,在HTTP上下文中顯式設置User,並使用中間件將ClaimsPrincipals轉換為MyClaimsPrincipals但所有這些似乎都無濟於事。 我想我沒說清楚。

一些具體問題:

  • 這是最好的方法嗎? 人們普遍對所有這些事情感到困惑,這使得很難判斷我是否走上了正確的道路。
  • 創建自定義主體后,如何將其“設置”到HTTP上下文中以使其持久化?
  • Cookie身份驗證如何與OpenId Connect身份驗證一起使用? 似乎OIDC以某種方式將用戶傳遞到Cookie身份驗證,並且需要添加cookie身份驗證才能使OIDC身份驗證正常工作。

使用OpenID Connect方案時要了解的重要一點是,該方案永遠不會獨立運行。 在幾乎每個示例中,您都可以找到它與cookie方案的結合。 原因很簡單:OIDC用於通過外部身份驗證提供程序對用戶進行身份驗證。 但是該身份驗證只是暫時的。 為了將其本地存儲在應用程序中,您需要登錄用戶。 這通常是通過Cookie身份驗證方案完成的(盡管它可以通過其他方式完成)。

使用OIDC和Cookie的應用程序的身份驗證流程通常如下所示:

  1. 用戶訪問您的應用程序。
  2. 身份驗證 :cookie方案(默認身份驗證方案)將嘗試對用戶進行身份驗證。 如果沒有cookie,則處理程序將挑戰身份驗證。
  3. 質詢 :OIDC方案(默認質詢方案)將質詢用戶並重定向到外部身份驗證提供程序。
  4. 用戶將通過外部身份驗證提供程序進行身份驗證,並將重定向到應用程序。
  5. 質詢回調 :OIDC方案將從外部身份驗證提供程序獲得響應,完成質詢並創建聲明主體。
  6. 登錄 :OIDC方案將使用其配置的登錄方案(cookie方案)登錄該主體。
  7. cookie方案將登錄用戶並創建一個持久保存在用戶瀏覽器中的cookie。
  8. 在對您的應用程序的后續請求中,用戶將包括有效的cookie,因此cookie方案可以成功驗證用戶身份,而無需再次挑戰OIDC方案。

因此,假設一切正常,OIDC方案將不再參與身份驗證。 而是每次都會使用cookie中的身份。

您可以將其用於您的目的,以擴展OIDC方案使用其他聲明創建的主體,然后再通過Cookie方案對其進行登錄和持久化。 你可以做到這一點使用自定義簽入方案的OIDC和餅干方案之間坐鎮,或者你可以簡單地連接到挑戰完成出現登錄之前被調用,但OIDC方案的認證活動。

您可以將TicketReceived事件用於此目的:

public void ConfigureServices(IServiceCollection services)
{
    // …

    services.AddAuthentication(options =>
    {
        options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
        options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
    })
        .AddCookie()
        .AddOpenIdConnect(options =>
        {
            // …

            options.Events.OnTicketReceived = OnOpenIdConnectTicketReceived;
        });
}

public static Task OnOpenIdConnectTicketReceived(TicketReceivedContext context)
{
    if (context.Principal.Identity is ClaimsIdentity identity)
    {
        identity.AddClaim(new Claim("foo", "bar"));
    }

    return Task.CompletedTask;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM