我可以在Azure AD SSO中使用与另一个应用程序发布的令牌吗?

时间:2016-03-11 12:38:29

标签: rest single-sign-on win-universal-app azure-active-directory azure-api-apps

我们说我配置了两个应用程序'在Azure AD中。一个是名为' A'另一个是名为' B'的本机Windows应用程序。用户下载' B'从Windows应用商店使用其Office 365凭据登录到Azure AD。效果很好。他们得到一个令牌。

我是否可以使用该令牌并将其附加到API应用程序的REST API调用中?' A'?

编辑:所以我已经做了我称之为进步的东西。我能够获得Web API的令牌,但我仍然未经授权而未经授权。它目前正在为我提供一个交互式登录,以获取Web API的令牌。

以下是有关我的配置的更多详细信息:

  • Azure AD租户
    • ' Foo App for UWP'
      • 应用程序类型:本机客户端应用程序
      • 客户ID:{123}
      • 重定向URI:ms-appx-web://Microsoft.AAD.BrokerPlugin/S-1-15-2-999
      • 其他应用程序的权限:
      • ' FooAPI':委派权限:'访问MyCompany.Foo.Api'
    • ' Foo Web API'
  • Azure API应用
    • api-foo-us-east.azurewebsites.net
      • 自定义域名:api.foo.com
      • 使用* .foo.com通配符证书启用SSL绑定
      • 应用服务身份验证
      • 使用Azure Active Directory登录
    • api-foo-us-west.azurewebsites.net
      • 自定义域名:api.foo.com
      • 使用* .foo.com通配符证书启用SSL绑定
      • 应用服务身份验证
      • 使用Azure Active Directory登录
    • api-foo-asia-southeast.azurewebsites.net
      • 自定义域名:api.foo.com
      • 使用* .foo.com通配符证书启用SSL绑定
      • 应用服务身份验证
      • 使用Azure Active Directory登录

现在代码。

当我验证我的UWP应用程序时,我正在执行此操作:

    static string clientId = "{123}";
    static string authority = "https://login.windows.net/{tenant_id}";
    static string uri = string.Format("ms-appx-web://Microsoft.AAD.BrokerPlugin/{0}", WebAuthenticationBroker.GetCurrentApplicationCallbackUri().Host.ToUpper());
    private AuthenticationContext authContext = new AuthenticationContext(authority);

    private async void AttemptLogin()
    {
        WebAccountProvider wap = await WebAuthenticationCoreManager.FindAccountProviderAsync("https://login.microsoft.com", authority);
        WebTokenRequest wtr = new WebTokenRequest(wap, string.Empty, clientId);
        wtr.Properties.Add("resource", "https://graph.windows.net");

        // there is no recorded user. let's start a sign in flow without imposing a specific account.
        WebTokenRequestResult wtrr = await WebAuthenticationCoreManager.RequestTokenAsync(wtr);
        if (wtrr.ResponseStatus == WebTokenRequestStatus.Success)
        {
            userAccount = wtrr.ResponseData[0].WebAccount;
            token = wtrr.ResponseData[0].Token;
        }

        if (userAccount != null)
        {
            OnUserSignedIn();
        }
        else
        {
             // we got bigger fish to fry!
        }
    }

    private void OnUserSignedIn()
    {
        var redirectUri = new Uri(uri);
        AuthenticationResult authResult = await authContext.AcquireTokenAsync("https://api.foo.com", clientId, redirectUri);

        // just some junk code to call the Web API
        var accountId = ApiClientHelper.AccountIdentifier;
        var client = ApiClientHelper.GetClient();
        client.HttpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(authResult.AccessTokenType, authResult.AccessToken);
        try
        {
            var allCustomers = await client.Customers.GetAllWithOperationResponseAsync(accountId);
        }
        catch (Exception ex)
        {
            Debug.WriteLine(ex.ToString());
        }
    }

有趣的是,当我获得' https://graph.windows.net'在AttemptLogin方法内部以及当我获得' https://api.foo.com'的标记时令牌字符串值为IDENTICAL。

我收到的状态代码是“未经授权的”#。

2 个答案:

答案 0 :(得分:0)

如果您是原生应用,则不会出现"登录"。您执行的操作是始终请求某个资源的令牌。在获取此类令牌的过程中,最终用户可能必须执行登录 - 但从应用程序的角度来看,操作是获取令牌。 因此:如果您在令牌获取操作中要求为您的API提供令牌,那么您将让用户完成登录手势,您将获得API的令牌。 即使您最初获得不同API的令牌 - 您与第一个访问令牌一起使用的刷新令牌也能够获取您的本机客户端注册请求访问的所有API的访问令牌,因此您可以获得您的API的新令牌,无需任何额外的用户互动。

答案 1 :(得分:0)

我弄明白为什么它不起作用。首先,我通过azure门户使用身份验证,而不是在我的应用程序中设置owin。其次,我错过了一个关键的nuget包,它非常关键,但不容易知道什么是错的。要运行startup.cs代码,需要Microsoft.owin.host.systemweb。没有它你只会收到未经授权的消息而没有其他解释。