MVC到Azure Active Directory签署回复“错误请求”和消息“无法创建以从中获取配置”

我究竟做错了什么?

我正在尝试从示例MVC应用程序登录Azure Active Directory并获取“错误请求”。

我在这里关注这个例子(2015年7月17日):

azure.microsoft.com的例子

以下是其他人对同一数据的逐步详细说明:

博客作者扩展了azure示例

我用下面的“myActiveDirectory”替换了我的活动目录的名称。

这是我的webconfig数据:

<add key="ida:AppKey" value="" /> <add key="ida:ClientId" value="d2bfc007--9f" />    

AccountController.cs

 using System.Web; using System.Web.Mvc; // OWIN using Microsoft.Owin.Security; using Microsoft.Owin.Security.OpenIdConnect; using Microsoft.Owin.Security.Cookies; namespace TodoListWebApp.Controllers { public class AccountController : Controller { public void SignIn() { // Sends an OpenID sign-in request. if (!Request.IsAuthenticated) { HttpContext.GetOwinContext(). Authentication.Challenge(new AuthenticationProperties { RedirectUri = "/" }, OpenIdConnectAuthenticationDefaults.AuthenticationType); } } public void SignOut() { // Sends an OpenID sign-out request. HttpContext.GetOwinContext().Authentication.SignOut( OpenIdConnectAuthenticationDefaults.AuthenticationType, CookieAuthenticationDefaults.AuthenticationType); } } } 

Startup.cs

 // OWIN using Owin; namespace ActiveDirSample { public partial class Startup { public void Configuration(IAppBuilder app) { ConfigureAuth(app); } } } 

Startup.Auth.cs

 using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Configuration; // OWIN using Owin; using Microsoft.Owin; using Microsoft.Owin.Security; using Microsoft.Owin.Security.OpenIdConnect; using Microsoft.Owin.Security.Cookies; using System.Globalization; [assembly: OwinStartup(typeof(ActiveDirSample.Startup))] namespace ActiveDirSample { public partial class Startup { private static string clientId = ConfigurationManager.AppSettings["ida:ClientId"]; private static string appKey = ConfigurationManager.AppSettings["ida:AppKey"]; private static string aadInstance = ConfigurationManager.AppSettings["ida:AADInstance"]; private static string tenant = ConfigurationManager.AppSettings["ida:Tenant"]; private static string postLogoutRedirectUri = ConfigurationManager.AppSettings["ida:PostLogoutRedirectUri"]; string authority = String.Format(CultureInfo.InvariantCulture, aadInstance, tenant); public void ConfigureAuth(IAppBuilder app) { app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType); app.UseCookieAuthentication(new CookieAuthenticationOptions()); app.UseOpenIdConnectAuthentication( new OpenIdConnectAuthenticationOptions { ClientId = clientId, Authority = authority, PostLogoutRedirectUri = postLogoutRedirectUri, }); } } } 

以下是我得到的回复:


 Server Error in '/' Application. Response status code does not indicate success: 400 (Bad Request). Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. Exception Details: System.Net.Http.HttpRequestException: Response status code does not indicate success: 400 (Bad Request). Source Error: An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below. Stack Trace: [HttpRequestException: Response status code does not indicate success: 400 (Bad Request).] System.Net.Http.HttpResponseMessage.EnsureSuccessStatusCode() +92108 Microsoft.IdentityModel.Protocols.d__0.MoveNext() in c:\workspace\WilsonForDotNet45Release\src\Microsoft.IdentityModel.Protocol.Extensions\Configuration\HttpDocumentRetriever.cs:54 [IOException: Unable to get document from: https://login.windows.net/myActiveDirectory.onmicrosoft.com/.well-known/openid-configuration] Microsoft.IdentityModel.Protocols.d__0.MoveNext() in c:\workspace\WilsonForDotNet45Release\src\Microsoft.IdentityModel.Protocol.Extensions\Configuration\HttpDocumentRetriever.cs:59 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +99 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +58 Microsoft.IdentityModel.Protocols.d__0.MoveNext() in c:\workspace\WilsonForDotNet45Release\src\Microsoft.IdentityModel.Protocol.Extensions\Configuration\OpenIdConnectConfigurationRetriever.cs:81 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +99 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +58 System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task) +25 Microsoft.IdentityModel.Protocols.d__3.MoveNext() in c:\workspace\WilsonForDotNet45Release\src\Microsoft.IdentityModel.Protocol.Extensions\Configuration\ConfigurationManager.cs:198 [InvalidOperationException: IDX10803: Unable to create to obtain configuration from: 'https://login.windows.net/myActiveDirectory.onmicrosoft.com/.well-known/openid-configuration'.] Microsoft.IdentityModel.Protocols.d__3.MoveNext() in c:\workspace\WilsonForDotNet45Release\src\Microsoft.IdentityModel.Protocol.Extensions\Configuration\ConfigurationManager.cs:212 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +99 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +58 Microsoft.Owin.Security.OpenIdConnect.d__c.MoveNext() +599 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +99 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +58 Microsoft.Owin.Security.Infrastructure.d__b.MoveNext() +292 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +99 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +58 Microsoft.Owin.Security.Infrastructure.d__8.MoveNext() +278 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +99 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +58 Microsoft.Owin.Security.Infrastructure.d__5.MoveNext() +165 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +99 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +58 Microsoft.Owin.Security.Infrastructure.d__0.MoveNext() +716 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +99 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +58 Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.d__5.MoveNext() +187 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +99 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +58 Microsoft.Owin.Security.Infrastructure.d__0.MoveNext() +561 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +99 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +58 Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.d__5.MoveNext() +187 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +99 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +58 Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.d__2.MoveNext() +185 Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.StageAsyncResult.End(IAsyncResult ar) +69 Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.IntegratedPipelineContext.EndFinalWork(IAsyncResult ar) +64 System.Web.AsyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +380 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155 Version Information: Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.6.81.0 

从调用堆栈中很难诊断出这个问题。 您可以尝试以下方法:

  1. 使用租户Guid而不是名称(当您在管理门户中的Azure AD实例上时,可以在URL中找到Guid)。 之前我遇到了问题,无法正确解析名称,并使用Guid帮助了。

    在Portal中,导航到Azure Active Directory>应用程序注册>端点,然后从端点URI复制guid。 这是租户ID。 在此处输入图像描述

    用web.config文件中的guid替换租户名称

      
  2. 在Azure AD中,您必须以足够的权限注册您的应用程序。 您需要配置权限才能读取目录信息。

这对我有用;

1-打开应用程序的Web.config文件。

2-在Web.config文件中,validation应用程序密钥“ida:SignUpPolicyId”是否存在。

3-将app key的值替换为您在Azure AD B2C管理门户中提供的注册策略的名称。

4 – 文件的更改部分将类似于以下内容:

    

您需要确保web配置中的所有配置与web.config匹配