c# - ASP.NET Core 3.1 Azure AD 身份验证引发 OptionsValidationException
问题描述
我正在尝试使用 Azure Active Directory 处理 Web 应用程序的身份验证。但是,当我尝试使用 执行操作时AuthorizeAttribute
,应用程序会抛出OptionsValidationException
. 出现以下错误:
Microsoft.Extensions.Options.OptionsValidationException: The 'Instance' option must be provided.
at Microsoft.Extensions.Options.OptionsFactory`1.Create(String name)
at Microsoft.Extensions.Options.OptionsMonitor`1.<>c__DisplayClass11_0.<Get>b__0()
at System.Lazy`1.ViaFactory(LazyThreadSafetyMode mode)
at System.Lazy`1.ExecutionAndPublication(LazyHelper executionAndPublication, Boolean useDefaultConstructor)
at System.Lazy`1.CreateValue()
at System.Lazy`1.get_Value()
at Microsoft.Extensions.Options.OptionsCache`1.GetOrAdd(String name, Func`1 createOptions)
at Microsoft.Extensions.Options.OptionsMonitor`1.Get(String name)
at Microsoft.AspNetCore.Authentication.AzureAD.UI.AzureADOpenIdConnectOptionsConfiguration.Configure(String name, OpenIdConnectOptions options)
at Microsoft.Extensions.Options.OptionsFactory`1.Create(String name)
at Microsoft.Extensions.Options.OptionsMonitor`1.<>c__DisplayClass11_0.<Get>b__0()
at System.Lazy`1.ViaFactory(LazyThreadSafetyMode mode)
at System.Lazy`1.ExecutionAndPublication(LazyHelper executionAndPublication, Boolean useDefaultConstructor)
at System.Lazy`1.CreateValue()
at System.Lazy`1.get_Value()
at Microsoft.Extensions.Options.OptionsCache`1.GetOrAdd(String name, Func`1 createOptions)
at Microsoft.Extensions.Options.OptionsMonitor`1.Get(String name)
at Microsoft.AspNetCore.Authentication.AuthenticationHandler`1.InitializeAsync(AuthenticationScheme scheme, HttpContext context)
at Microsoft.AspNetCore.Authentication.AuthenticationHandlerProvider.GetHandlerAsync(HttpContext context, String authenticationScheme)
at Microsoft.AspNetCore.Authentication.AuthenticationService.ChallengeAsync(HttpContext context, String scheme, AuthenticationProperties properties)
at Microsoft.AspNetCore.Authentication.AuthenticationHandler`1.ChallengeAsync(AuthenticationProperties properties)
at Microsoft.AspNetCore.Authentication.AuthenticationService.ChallengeAsync(HttpContext context, String scheme, AuthenticationProperties properties)
at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)
我无法弄清楚是什么原因造成的。这是代码:
Microsoft.AspNetCore.Authentication.AzureAD.UI
添加对版本 3.1.1的包引用。
创业班
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication(defaultScheme: AzureADDefaults.AuthenticationScheme)
.AddAzureAD(options =>
{
options.ClientId = "<client_id_goes_here>";
options.TenantId = "<tenant_id_goes_here>";
});
services.AddControllers();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseDeveloperExceptionPage();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints => endpoints.MapControllers());
}
家庭控制器
仅使用一个控制器。
public class HomeController : Controller
{
[Route("")]
[AllowAnonymous]
public string Index() => "Hello Anonymous User!";
[Route("restricted")]
[Authorize]
public string Restricted() => $"Hello, {User.Identity.Name}.";
}
当您运行应用程序并点击 Index 操作时,您将获得异常输出:
Hello Anonymous User!
当您到达/restricted
端点时,就会引发异常。
解决方案
您没有提供Microsoft.AspNetCore.Authentication.AzureAD.UI
Azure AD 身份验证所需的多个配置,例如Instance
、CallbackPath
。您可以修改您的代码如下:
services.AddAuthentication(AzureADDefaults.AuthenticationScheme)
.AddAzureAD(options => Configuration.Bind("AzureAd", options));
然后在appsettings.json
,添加 bleow 配置:
"AzureAd": {
"Instance": "https://login.microsoftonline.com/",
"Domain": "xxxx.onmicrosoft.com",
"TenantId": "xxxxxx-a2dd-4fde-bf8f-f75ab18b21ac",
"ClientId": "xxxxxxxxx-a9bb-4722-b615-6dcbdc646326",
"CallbackPath": "/signin-oidc"
},
当然,您应该在 Azure 门户中提供真实的 domian/tenant/clientid,并在门户中注册https://localhost:xxx/signin-oidc
为重定向 url。
另一种方法是使用 Azure AD 身份验证模板:新建 ASP.NET Core 应用程序 --> 选择 MVC/Razor 模板 --> 更改身份验证 --> 工作或学校帐户 --> 选择您的租户,该模板将帮助配置您的应用程序实施 Azure AD 身份验证。
推荐阅读
- azure - 如何使用我在 Azure Active Directory 中创建的应用程序注册本地创建的应用程序?
- python - Pygame 蛇吃自己
- r - 打印数据集的 2 个连续数据条目的第一个和最后一个值以绘制差异 - 在 R 中
- javascript - 在 Ajax 上获取 PDF 的输出流并在另一个文档上打开它
- python - 安装 cx_Freeze
- angular - 如何在角度测试用例中模拟 @viewchild
- sql - SQL 行抛出错误 3134(插入语法)
- vue.js - 如何在 Vue 搜索框中使用查询参数?
- c# - Pag.Previous 页面返回 null
- spring - 是否可以在 Spring MVC 中的 @Scheduled 下调用 @RequestMapping