首页 > 解决方案 > ASP.NET MVC 5 中的 Azure AD 身份验证

问题描述

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

如果我使用 MVC 5 模板创建一个新网站并让 Visual Studio (2017) 创建一个新的应用程序注册,这一切都很好。

在此处输入图像描述

当我尝试使用我创建的那个时它不起作用,我得到了这个异常:

在此处输入图像描述

堆栈跟踪:

在 Microsoft.IdentityModel.Protocols.HttpDocumentRetriever.d__8.MoveNext() --- 在 System.Runtime 的 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 中从先前引发异常的位置结束堆栈跟踪。 CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) Microsoft.IdentityModel.Protocols.OpenIdConnect.OpenIdConnectConfigurationRetriever.d__3.MoveNext() --- 在 System.Runtime.CompilerServices.TaskAwaiter 上一个抛出异常的位置结束堆栈跟踪。 ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task)
在 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,

                },
            });
    }

我能找到的唯一区别是自动创建的应用程序注册有一个键,它的清单包含“passwordCredentials”。

在此处输入图像描述

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

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

标签: c#asp.net-mvcazure-active-directoryowinopenid

解决方案


我无法使其与租户 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);
                    }
                }
            });
    }
}

推荐阅读