使用Azure Active Directory进行单一登录

时间:2016-02-18 16:56:24

标签: asp.net asp.net-mvc azure azure-active-directory

我有一堆我已创建的网络应用。其中一些使用旧式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/" />

1 个答案:

答案 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