c# - 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 上,结果相同......
解决方案
我无法使其与租户 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);
}
}
});
}
}
推荐阅读
- android - 当手机屏幕关闭或休眠时,片段布局退出我的应用程序
- jquery - 使用 jspdf 和 html2canvas 将包含图像的 html 页面下载到 pdf
- c# - 静态属性作为该类的实例的线程安全注意事项
- laravel - Laravel MethodNotAllowedHttpException 无消息
- r - 零计数的交叉表
- android - Flutter - json_serializable fromJson:在 null 上调用了方法“[]”
- python - 如何引用不在索引中的列?
- fakeiteasy - 如何断言方法调用?
- r - 有没有办法在 ioslides(R Markdown)中使用 html 文件(布局)?
- mysql - 将 MySQL 脚本移植到 MS SQL -> 同步数据分配和检索