首页 文章

Azure移动服务和Azure Web App身份验证

提问于
浏览
5

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

Setup

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

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

User on Web

我得到的是Object Adentifier值,即AAD SID:

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

User on Mobile

我只获得Nameidentifier值而没有ObjectIdentifier

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

SID完全不同,用户通过Mobile进行身份验证的SID获取SID:xxxx,而来自Web获取xxx

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

谢谢

2 回答

  • 1

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

    1)从AAD,通过Web浏览器登录AAD .

    2)从Azure应用服务(Web应用程序和移动应用程序),可能来自我们客户端的LoginAsync . 此方法将调用服务器控制的登录流程 .

    这是设计的 . MobileServiceClient获取App Service令牌,并使用该令牌对您的Mobile App进行身份验证 . 您可以通过对.auth / me endpoints 进行GET来交换从Azure App Service获取的用于AAD SID的身份验证令牌 .

    在使用App Service和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

  • 0

    我终于得到了它的工作:

    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();
    

相关问题