【问题标题】:Azure Mobile Service and Azure Web App authenticationAzure 移动服务和 Azure Web App 身份验证
【发布时间】:2016-07-13 19:09:55
【问题描述】:

当用户通过 Azure Web 应用程序 (ASP.NET MVC) 和 Xamarin.iOS 应用程序登录时,我为同一用户获得了两个不同的 SID

设置

带有 API 控制器的 Azure WebApp ASP.NET 5

Xamarin iOS 应用与 Microsoft.WindowsAzure.Mobile.Client SDK Azure B2C AAD

网络用户

我得到了 AAD SID 的 ObjectIdentifier 值:

var userClaim = ClaimsPrincipal.Current.FindFirst("http://schemas.microsoft.com/identity/claims/objectidentifier").Value;

移动用户

我只得到一个 Nameidentifier 值,没有 ObjectIdentifier

ClaimsPrincipal mobileUser = this.User as ClaimsPrincipal;
var mobileUserClaim = mobileUser.FindFirst("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier");

SID 完全不同,用户身份验证的 SID 从 Mobile 获取 SID:xxxx 而从 Web 获取 xxx

我知道如果我设置了一个 Azure 移动应用程序和一个 Azure Web 应用程序,那么在进行身份验证时 SID 是相同的。但我不想为我的应用程序的大小(小)管理两个站点。该应用程序的目的是让一个简单的 Web 应用程序在电话上执行一些操作和相同的操作,从电话我使用 Azure 移动服务 SDK 和 InvokeAPIAsync 来使用 Web 应用程序中的 API 控制器。

谢谢

【问题讨论】:

    标签: azure azure-web-app-service azure-mobile-services azure-active-directory claims-based-identity


    【解决方案1】:

    我想澄清一下情况。 您正在观察两个 SID:

    1) 从 AAD,通过网络浏览器登录 AAD。

    2) 来自 Azure 应用服务(Web 应用和移动应用),可能来自使用我们客户端的 LoginAsync。此方法将调用服务器导向的登录流程。

    这是设计使然。 MobileServiceClient 获取应用服务令牌,并使用该令牌对您的移动应用进行身份验证。您可以通过对 .auth/me 端点进行 GET 操作,将您从 Azure 应用服务获得的身份验证令牌交换为 AAD SID。

    在您的客户端通过应用服务和 AAD 进行身份验证后,您可以通过调用 yoursite.azurewebsites.net/.auth/me 并解析您的声明的响应来获取有关 AAD 用户(或任何身份提供者)的更多信息想要:

    ({"typ" : "http://schemas.microsoft.com/identity/claims/objectidentifier").

    另一种策略是使用客户端应用程序中的 ADAL (http://www.nuget.org/packages/Microsoft.IdentityModel.Clients.ActiveDirectory/) 通过 AAD 登录,然后使用 AAD 访问令牌通过适当的 LoginAsync 重载获取移动应用程序令牌:

    https://github.com/Azure/azure-mobile-apps-net-client/blob/master/src/Microsoft.WindowsAzure.MobileServices.iOS/Extensions/MobileServiceClientExtensions.cs#L55

    您添加的参数格式应为 {"access_token":"[AAD access_token value]"}

    Brett Samblanet 在 .NET 服务器上关于用户 ID 的 wiki 应该有助于理解发生了什么: https://github.com/Azure/azure-mobile-apps-net-server/wiki/Understanding-User-Ids

    【讨论】:

    • 感谢您花时间回答。我已经使用带有 Token 的 LoginAsync 重载测试了您的示例,但我使用了 Bearer 或 access_token。今晚我会测试这个。谢谢
    • 另一个问题:如果我从客户端(iOS 应用程序)使用 ADAL,我可以使用检索到的 AAD AccessToken 来针对我的 WebApp API 对用户进行身份验证吗?我试过这个。其中 authResult.AccessToken 是通过 ADAL 的 AAD 访问令牌。但我从未能够针对我的 WebApp API 进行身份验证,未经授权。参数是否错误,而不是 Bearer,应该是 access_token 吗?今晚我会试一试。 HttpClient 客户端 = 新 HttpClient(); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", authResult.AccessToken);
    • @JCB 抱歉耽搁了。不可以,您的 AAD 访问令牌不能用于针对 WebApp 进行身份验证。您需要将其交换为 AppService 令牌。具体来说,再次查看我在帖子末尾提到的 LoginAsync() 重载。结果将是一个应用服务令牌。
    • 嗨,Aziel,也很抱歉我的延误。没有时间尝试这个,但我现在做了。当我使用 LoginAsync 重载时,我让 PopOver 视图再次登录到 AAD。 Dictionary msgDic = new Dictionary(); msgDic.Add("access_token", authResult.AccessToken);等待 mobileServiceClient.LoginAsync(this, MobileServiceAuthenticationProvider.WindowsAzureActiveDirectory, msgDic);如果这已成功登录并且我已经获得了应用服务令牌,那么带有此令牌的 Auth 标头上应该是什么值?谢谢
    【解决方案2】:

    我终于让它工作了:

    string authority = "https://login.windows.net/[TentantId].onmicrosoft.com/";
                string resourceId = "[myApiClientId]";
                string clientId = "[clientId]";
                string redirectUri = "https://[URL]/.auth/login/done";
    
                AuthenticationContext ac = new AuthenticationContext(authority);
                AuthenticationResult ar = await ac.AcquireTokenAsync(resourceId, clientId,
                    new Uri(redirectUri), new PlatformParameters(this));
                JObject payload = new JObject();
                payload["access_token"] = ar.AccessToken;
    
                string authHeader = ar.CreateAuthorizationHeader();
                HttpClient client = new HttpClient();
                HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "[API URL Route]");
                request.Headers.TryAddWithoutValidation("Authorization", authHeader);
                HttpResponseMessage response = await client.SendAsync(request);
                string content = await response.Content.ReadAsStringAsync();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多