簡體   English   中英

Blazor 服務器端和 Azure B2C 使用邀請登錄,如何使用返回的令牌進行身份驗證?

[英]Blazor Server Side and Azure B2C Login using invite, how to authenticate with returned token?

我遵循了一些關於如何Signup by invite不同教程,我非常接近讓它在 blazor 服務器端工作,但我對最終返回的令牌有疑問。

我有 2 個身份驗證設置,一個是默認的 Microsoft Identity,另一個是我的自定義身份驗證設置,用於通過 email 鏈接進行注冊。

在最后一步之前,一切似乎都有效。 當您單擊該鏈接時,它會將您帶到 Azure 注冊頁面,詢問姓名、email 等,然后返回到我的網站並返回“id_token”。

發生這種情況時,我收到以下錯誤。

InvalidOperationException:為方案“OpenIdConnect”注冊的身份驗證處理程序是“OpenIdConnectHandler”,不能用於 SignInAsync。 注冊簽到方案為:Cookies。

我在事件TicketReceivedOpenIdConnectEvents中設置了斷點,我可以看到TicketReceivedContext object 具有有效的ClaimsPrinciple和正確的聲明,並且IsAuthenticated為真。

由於錯誤,我的返回頁面永遠不會被點擊。

有想法該怎么解決這個嗎?

為 2 個身份驗證編輯我的啟動注冊。

builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApp(options =>{    

builder.Configuration.Bind("AzureAd", options);

options.ResponseType = OpenIdConnectResponseType.IdToken;

options.Events = new CustomOpenIdConnectEvents();
options.DataProtectionProvider = protector;

}, subscribeToOpenIdConnectMiddlewareDiagnosticsEvents: true);

string invite_policy = builder.Configuration.GetSection("AzureAdB2C")["SignUpSignInPolicyId"]; builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
    .AddOpenIdConnect(invite_policy, GetOpenIdSignUpOptions(invite_policy, builder.Configuration));

Action<OpenIdConnectOptions> GetOpenIdSignUpOptions(string policy, Microsoft.Extensions.Configuration.ConfigurationManager Configuration)
           => options =>
           {
               builder.Configuration.Bind("AzureAdB2C", options);

               options.ResponseType = OpenIdConnectResponseType.IdToken;

               string B2CDomain = Configuration.GetSection("AzureAdB2C")["B2CDomain"];
               string Domain = Configuration.GetSection("AzureAdB2C")["Domain"];

               options.MetadataAddress = $"https://{B2CDomain}/{Domain}/{policy}/v2.0/.well-known/openid-configuration";

               options.ResponseMode = OpenIdConnectResponseMode.FormPost;                                                                              

               options.CallbackPath = "/LoginRedirect";                        

               options.Events = new CustomOpenIdConnectEvents();

               options.DataProtectionProvider = protector;
           };

更新:
因此,感謝 Wolfspirit 的回答,我現在離解決問題更近了。 我的啟動注冊現在已經更改為這個。

string invite_policy = builder.Configuration.GetSection("AzureAdB2C")["SignUpSignInPolicyId"];
builder.Services.AddAuthentication(options => {
options.DefaultScheme = 
CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddOpenIdConnect(invite_policy, GetOpenIdSignUpOptions(invite_policy, builder.Configuration))
.AddMicrosoftIdentityWebApp(options =>{    

builder.Configuration.Bind("AzureAd", options);

options.ResponseType = OpenIdConnectResponseType.IdToken;

options.Events = new CustomOpenIdConnectEvents();
options.DataProtectionProvider = protector;

}, subscribeToOpenIdConnectMiddlewareDiagnosticsEvents: true);

我現在的問題是,如果您通過注冊方法登錄, User.Identity.Name將返回 null。 如果您以正常的默認方式登錄,那么一切都很好。 我檢查了聲明,它們是正確的,所以不確定為什么沒有填充Name

根據您遇到的錯誤,您已將“OpenIdConnect”設置為“AddAuthentication”調用中的登錄方案。 了解您如何設置 Program.cs/Startup.cs 會很有幫助,但它看起來應該與此類似,例如:

https://github.com/onelogin/openid-connect-do.net-core-sample/blob/master/Startup.cs#L32

您需要同時使用這兩種方案,因為一個方案管理“登錄后存儲身份驗證的位置”,而另一個管理“如何登錄”方式。 如果您將兩者都設置為 OpenIdConnect,那么您可以登錄,但 asp.net 核心將不知道如何通過將登錄結果存儲到 cookie 中來實際“登錄”您。

好的,所以我找到了答案,感謝 Wolfspirit 為我指明了正確的方向。

string invite_policy = builder.Configuration.GetSection("AzureAdB2C")["SignUpSignInPolicyId"];
builder.Services.AddAuthentication(options => {
     options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
     options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddOpenIdConnect(invite_policy, GetOpenIdSignUpOptions(invite_policy, builder.Configuration))
.AddMicrosoftIdentityWebApp(options =>{    

builder.Configuration.Bind("AzureAd", options);

options.ResponseType = OpenIdConnectResponseType.IdToken;

options.Events = new CustomOpenIdConnectEvents();
options.DataProtectionProvider = protector;

// Thanks to Nan Yu for the folowing to fix the null name after login
//https://stackoverflow.com/questions/54444747/user-identity-name-is-null-after-federated-azure-ad-login-with-aspnetcore-2-2
options.TokenValidationParameters = new TokenValidationParameters() { NameClaimType = "name" };

}, subscribeToOpenIdConnectMiddlewareDiagnosticsEvents: true); // don't need this, for debugging.

暫無
暫無

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

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