[英].Net Core 2 OpenID Connect Authentication and multiple Identities
我仍在學習Identity Framework,並且在嘗試在我的.Net Core 2 MVC應用程序中設置身份驗證時非常迷失。 感謝我提供任何建議,因為我什至不確定自己在做什么。
我需要集成OpenID Connect身份提供程序進行身份驗證,並使用輔助數據源進行授權 。 除名稱聲明外,我不方便使用OIDC IdP的任何聲明。 其余的用戶聲明必須來自輔助數據源(通過自定義UserStore
和User
實體連接到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
但所有這些似乎都無濟於事。 我想我沒說清楚。
一些具體問題:
使用OpenID Connect方案時要了解的重要一點是,該方案永遠不會獨立運行。 在幾乎每個示例中,您都可以找到它與cookie方案的結合。 原因很簡單:OIDC用於通過外部身份驗證提供程序對用戶進行身份驗證。 但是該身份驗證只是暫時的。 為了將其本地存儲在應用程序中,您需要登錄用戶。 這通常是通過Cookie身份驗證方案完成的(盡管它可以通過其他方式完成)。
使用OIDC和Cookie的應用程序的身份驗證流程通常如下所示:
因此,假設一切正常,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.