将 Azure B2C 与 MVC、.NET Core 3.1 结合使用

Posted

技术标签:

【中文标题】将 Azure B2C 与 MVC、.NET Core 3.1 结合使用【英文标题】:Using Azure B2C with MVC, .NET Core 3.1 【发布时间】:2020-07-14 21:43:00 【问题描述】:

谁能提供一些关于的见解或新链接。大多数示例都基于 Core 2.2

https://docs.microsoft.com/en-us/samples/azure-samples/active-directory-b2c-dotnetcore-webapp/an-aspnet-core-web-app-with-azure-ad-b2c/

但是,3.1 似乎有很多不同的地方。

我在2.2遇到的错误是:

System.ArgumentNullException:值不能为空。 (参数'uriString') 在 System.Uri..ctor(字符串 uriString) 在 Microsoft.AspNetCore.Authentication.AzureADB2C.UI.AzureADB2COpenIdConnectOptionsConfiguration.BuildAuthority(AzureADB2COptions AzureADB2COptions) 在 Microsoft.AspNetCore.Authentication.AzureADB2C.UI.AzureADB2COpenIdConnectOptionsConfiguration.Configure(字符串名称,OpenIdConnectOptions 选项) 在 Microsoft.Extensions.Options.OptionsFactory1.Create(String name) at Microsoft.Extensions.Options.OptionsMonitor1.c__DisplayClass11_0.b__0() 在 System.Lazy1.ViaFactory(LazyThreadSafetyMode mode) at System.Lazy1.ExecutionAndPublication(LazyHelper executionAndPublication, Boolean useDefaultConstructor) 在 System.Lazy1.CreateValue() at System.Lazy1.get_Value() 在 Microsoft.Extensions.Options.OptionsCache1.GetOrAdd(String name, Func1 createOptions) 在 Microsoft.Extensions.Options.OptionsMonitor1.Get(String name) at Microsoft.AspNetCore.Authentication.AuthenticationHandler1.InitializeAsync(AuthenticationScheme 方案,HttpContext 上下文) 在 Microsoft.AspNetCore.Authentication.AuthenticationHandlerProvider.GetHandlerAsync(HttpContext 上下文,字符串 authenticationScheme) 在 Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext 上下文) 在 Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext 上下文)

【问题讨论】:

您是否参考了示例:github.com/Azure-Samples/…? 另外,你能告诉我你的错误吗? 我尝试了您上面引用的 github 示例,但我无法理解/实现它。我在原始帖子中添加了异常详细信息/错误。 【参考方案1】:

如果要为 .net 核心应用程序配置 Azure AD B2C 身份验证,可以使用 sdk Microsoft.AspNetCore.Authentication.AzureADB2C.UI。但请注意,您需要根据您使用的 .net core 版本选择正确的 sdk 版本。比如你使用.net core 2.2,sdk版本应该是2.2.0。

具体步骤如下

    Register a web application in Azure AD B2C tenant

    在 Web 应用程序中实现 Azure AD B2C 身份验证

    一个。在 appsettings.json 中添加以下设置

     
    "AzureAdB2C": 
    "Instance": "https://<your-tenant-name>.b2clogin.com",
    "ClientId": "<web-app-application-id>",
    "Domain": "<your-b2c-domain>"
    "CallbackPath": "/signin-oidc",
    "SignUpSignInPolicyId": "B2C_1_test",
    "ResetPasswordPolicyId": "B2C_1_test2",
    "EditProfilePolicyId": "B2C_1_test1"
    ,
    ...
    
    
    

    b.在 Startup.cs 中添加以下代码

     public void ConfigureServices(IServiceCollection services)
      
          services.Configure<CookiePolicyOptions>(options =>
          
              // This lambda determines whether user consent for non-essential cookies is needed for a given request.
              options.CheckConsentNeeded = context => true;
              options.MinimumSameSitePolicy = SameSiteMode.None;
          );
    
          services.AddAuthentication(AzureADB2CDefaults.AuthenticationScheme)
              .AddAzureADB2C(options => Configuration.Bind("AzureAdB2C", options));
    
          services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
      
    
      // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
      public void Configure(IApplicationBuilder app, IHostingEnvironment env)
      
          if (env.IsDevelopment())
          
              app.UseDeveloperExceptionPage();
          
          else
          
              app.UseExceptionHandler("/Home/Error");
              // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
              app.UseHsts();
          
    
          app.UseHttpsRedirection();
          app.UseStaticFiles();
          app.UseCookiePolicy();
    
          app.UseAuthentication();
    
          app.UseMvc(routes =>
          
              routes.MapRoute(
                  name: "default",
                  template: "controller=Home/action=Index/id?");
          );
      
    

    c。实现登录和注销。 sdk 帮助我们实现了登录和注销方法。所以我们可以直接使用它。例如

我的 login.cshtml

@using System.Security.Principal
@using Microsoft.AspNetCore.Authentication.AzureADB2C.UI
@using Microsoft.Extensions.Options
@inject IOptionsMonitor<AzureADB2COptions> AzureADB2COptions

@
    var options = AzureADB2COptions.Get(AzureADB2CDefaults.AuthenticationScheme);



<ul class="navbar-nav">
@if (User.Identity.IsAuthenticated)


            <li class="nav-item">
                <span class="nav-text text-dark">Hello @User.Identity.Name!</span>
            </li>

        <li class="nav-item">
            <a class="nav-link text-dark" asp-area="AzureADB2C" asp-controller="Account" asp-action="SignOut">Sign out</a>
        </li>

else

        <li class="nav-item">
            <a class="nav-link text-dark" asp-area="AzureADB2C" asp-controller="Account" asp-action="SignIn">Sign in</a>
        </li>

</ul>
    测试

【讨论】:

这绝对有效,但我试图使用 Microsoft.AspNetCore.Authentication.OpenIdConnect 这应该允许我构建自己的 SessionController。我试图更好地控制用户退出时显示的页面。使用 AzureAdB2C,我只能显示从 AzureAdB2C“区域”返回的视图。我想使用另一个示例中的以下语法注销: return SignOut(new AuthenticationProperties RedirectUri = callbackUrl , CookieAuthenticationDefaults.AuthenticationScheme, OpenIdConnectDefaults.AuthenticationScheme); @stephen 是不是在调用自己的signout方法的时候出现了上面的错误? 吉姆,好问题。当我尝试使用 OpenIdConnect 时,我一启动 Web 应用程序就遇到了原帖中引用的异常。 @stephen 您能否提供一个简单的示例让我重现该问题? 只需从原链接docs.microsoft.com/en-us/samples/azure-samples/…下载项目并将框架更改为.NET Core 3.1。 ILoggerFactory 有一个小问题,但这很容易解决。在那之后,我的 AzureADB2C 工作正常,但没有(HTTP 错误 500.0 - ANCM 进程内处理程序加载失败)。

以上是关于将 Azure B2C 与 MVC、.NET Core 3.1 结合使用的主要内容,如果未能解决你的问题,请参考以下文章

Azure B2C 和 .net core 3.1 身份验证问题

Azure AD B2C 与 ASP.NET Web API 发出令牌,用于 Web API 中的身份验证和访问 MS Graph API

如何将 azure b2c 与 react 集成

Azure AD 与 Azure AD B2C 与 Azure AD B2B

Azure AD B2C 与企业 (Azure?) AD 帐户集成

ASP.NET 5 API - Azure AD B2C