将 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.OptionsFactory
1.Create(String name) at Microsoft.Extensions.Options.OptionsMonitor
1.c__DisplayClass11_0.b__0() 在 System.Lazy1.ViaFactory(LazyThreadSafetyMode mode) at System.Lazy
1.ExecutionAndPublication(LazyHelper executionAndPublication, Boolean useDefaultConstructor) 在 System.Lazy1.CreateValue() at System.Lazy
1.get_Value() 在 Microsoft.Extensions.Options.OptionsCache1.GetOrAdd(String name, Func
1 createOptions) 在 Microsoft.Extensions.Options.OptionsMonitor1.Get(String name) at Microsoft.AspNetCore.Authentication.AuthenticationHandler
1.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 AD 与 Azure AD B2C 与 Azure AD B2B