我有一堆我已创建的网络应用。其中一些使用旧式webforms身份验证,我们公司的其他一些站点使用不同的身份验证模式。
我尝试使用Azure Active Directory在一种SSO模式下整合此功能。我一直在尝试按照指南/教程进行操作,但它没有点击给我。
我的技术目前是ASP 4 / MVC 5,虽然如果ASP 5 / MVC 6更容易,那么我也可以自由地走这条路。目前,所有网络应用都托管在Azure中。
对我而言,令人困惑的是,在查看文档时,似乎有很多方法可以对用户进行身份验证和授权(同样,身份验证和授权对我来说也不是很清楚)。
我访问了Azure管理门户(旧版)的Active Directory区域。我添加了一个名为TestApp
的新应用程序。我将应用网址设置为https://localhost:44320/
,然后将网址登录为https://localhost:44320/
,将租户名称设置为testapp
。我的回复网址为https://localhost:44320/
这让我的app app uri https://localhost:44320/testapp
我觉得呢?我也有我的客户端ID guid。
本教程有一个AccountController
,其SignIn
方法如下:
public void SignIn()
{
// Send an OpenID Connect sign-in request.
if (!Request.IsAuthenticated)
{
HttpContext.GetOwinContext().Authentication.Challenge(new AuthenticationProperties { RedirectUri = "/" }, OpenIdConnectAuthenticationDefaults.AuthenticationType);
}
}
导航到此时,我在浏览器中收到以下内容:
[InvalidOperationException:IDX10803:无法创建以从以下位置获取配置:' https://localhost:44320/testapp/.well-known/openid-configuration'。]
我有一种感觉,因为Azure无法将此全部重定向回我的本地主机?我该如何设置它以便我可以在Azure上测试它?除此之外,这个解决方案是否可以从多个Web应用程序中使用?我假设他们每个人都是我的Active Directory中的不同应用程序,但他们都需要使用SSO程序,用户可以使用一个身份登录多个应用程序。
对于任何混淆感到抱歉,这对我来说非常复杂,但我尽力了解它。
编辑:
在webapp的启动中,我称之为:
private static string clientId = ConfigurationManager.AppSettings["ida:ClientId"];
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,
Notifications = new OpenIdConnectAuthenticationNotifications
{
AuthenticationFailed = context =>
{
context.HandleResponse();
context.Response.Redirect("/Error?message=" + context.Exception.Message);
return Task.FromResult(0);
}
}
});
}
利用这些app.config设置:
<add key="ida:ClientId" value="[my client id here]" />
<add key="ida:Tenant" value="testapp" />
<add key="ida:AADInstance" value="https://localhost:44320/{0}" />
<add key="ida:PostLogoutRedirectUri" value="https://localhost:44320/" />
答案 0 :(得分:1)
Azure能够重定向到localhost,它只会弹出一个安全确认,询问是否可以导航到localhost。
app.config中的租户看起来不对,请更改以下应用设置:
<add key="ida:Tenant" value="[YOUR TENANT].onmicrosoft.com" />
<add key="ida:AADInstance" value="https://login.microsoftonline.com/{0}" />
要了解有关租户的更多信息,请参阅此文章:How to get an Azure Active Directory tenant
您也可以尝试将此代码添加到启动时的通知中(在AuthenticationFailed下),尝试在处理程序上添加断点以查看会发生什么:
AuthenticationFailed = context =>
{
context.HandleResponse();
context.Response.Redirect("/Error?message=" + context.Exception.Message);
return Task.FromResult(0);
},
SecurityTokenValidated = (context) =>
{
return Task.FromResult(0);
}
在您的某个控制器上放置一个[Authorize]属性,当您浏览它时,它应该重定向到AAD身份验证。
AFAIK每个应用程序在Azure AD中都需要一个单独的应用程序,您需要在每个单独的应用程序中实现此身份验证。当我通过网址从一个应用程序链接到另一个应用程序时,我已经设法获得了无缝的登录体验。
这个答案很好地总结了身份验证与授权:Authentication versus Authorization