我的问题是,当手动创建应用程序注册(在Azure门户中)时,无法使Azure AD身份验证起作用。

如果我使用MVC 5模板创建新网站并让Visual Studio(2017)创建新的App注册,则一切正常。

c# - ASP.NET MVC 5中的Azure AD身份验证-LMLPHP

当我尝试使用自己创建的程序时,它不起作用,并且出现此异常:

c# - ASP.NET MVC 5中的Azure AD身份验证-LMLPHP

堆栈跟踪:


  在
  Microsoft.IdentityModel.Protocols.HttpDocumentRetriever.d__8.MoveNext()
  ---从上一个引发异常的位置开始的堆栈跟踪-
  System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务
  任务)
  System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务
  任务)
  Microsoft.IdentityModel.Protocols.OpenIdConnect.OpenIdConnectConfigurationRetriever.d__3.MoveNext()
  ---从上一个引发异常的位置开始的堆栈跟踪-
  System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务
  任务)
  System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务
  任务)
  System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(任务任务)
  在
  Microsoft.IdentityModel.Protocols.ConfigurationManager`1.d__24.MoveNext()


我在两个中都使用的启动代码:

private static string aadInstance = ConfigurationManager.AppSettings["ida:AADInstance"];
    private static string clientId = ConfigurationManager.AppSettings["ida:ClientId"];
    private static string postLogoutRedirectUri = ConfigurationManager.AppSettings["ida:PostLogoutRedirectUri"];
    private static string tenant = ConfigurationManager.AppSettings["ida:TenantId"];
    private 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,
                RedirectUri = postLogoutRedirectUri,
                Notifications = new OpenIdConnectAuthenticationNotifications
                {
                    AuthenticationFailed = context =>
                    {
                        context.HandleResponse();
                        context.Response.Redirect("/Error?message=" + context.Exception.Message);
                        return Task.FromResult(0);
                    }
                },
                TokenValidationParameters = new TokenValidationParameters
                {

                    RequireSignedTokens = false,

                },
            });
    }


我能够找到的唯一区别是,自动创建的App注册具有一个密钥,并且其清单包含“ passwordCredentials”。

c# - ASP.NET MVC 5中的Azure AD身份验证-LMLPHP

手动创建的应用没有此应用。我对两个网站都使用IIS Express。 Application ID和Tenant ID以及HTTPS端口都是正确的。所有OWIN软件包都具有相同的版本(在两个应用程序中)。我认为IIS Express以某种方式从上方使用了该密钥,但是由于启动代码完全相同,所以我找不到它在哪里或如何应用。任何帮助表示赞赏

PS:我也尝试将其托管在本地IIS上,结果相同。

最佳答案

我无法使其与租户ID一起使用(仍然不知道为什么),但是当我使用租户名称时,它最终可以与手动创建的应用程序注册一起使用。

public partial class Startup
{
    private static string aadInstance = ConfigurationManager.AppSettings["ida:AADInstance"];
    private static string clientId = ConfigurationManager.AppSettings["ida:ClientId"];
    private static string postLogoutRedirectUri = ConfigurationManager.AppSettings["ida:PostLogoutRedirectUri"];
    private static string tenant = ConfigurationManager.AppSettings["ida:Tenant"];
    private string authority = string.Format(CultureInfo.InvariantCulture, aadInstance, tenant);

    /// <summary>
    /// Configures the authentication.
    /// </summary>
    /// <param name="app">The application.</param>
    public void ConfigureAuth(IAppBuilder app)
    {
        app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);

        app.UseCookieAuthentication(new CookieAuthenticationOptions());

        app.UseOpenIdConnectAuthentication(
            new OpenIdConnectAuthenticationOptions
            {
                ClientId = clientId,
                Authority = authority,
                PostLogoutRedirectUri = postLogoutRedirectUri,
                RedirectUri = postLogoutRedirectUri,
                Notifications = new OpenIdConnectAuthenticationNotifications
                {
                    AuthenticationFailed = context =>
                    {
                        context.HandleResponse();
                        context.Response.Redirect("/Error?message=" + context.Exception.Message);
                        return Task.FromResult(0);
                    }
                }
            });
    }
}

关于c# - ASP.NET MVC 5中的Azure AD身份验证,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50274457/

10-11 02:41