Xamarin Native

时间:2017-05-26 10:42:21

标签: c# azure xamarin.ios active-directory azure-mobile-services

TL; DR

使用AuthenticationContext.AcquireTokenAsync()MobileServiceClient.LoginAsync()对用户进行身份验证有何区别? 我可以使用第一种方法中的令牌来验证第二种方法中的用户吗?


长版

我一直试图通过移动设备(iOS)对 Azure 中的移动服务进行身份验证,其中 Xamarin Native (不是表格)。

网上有足够的教程可以帮助你入门,但在这个过程中,我迷失了方向并感到困惑......

目前正在工作的是以下内容;用户在另一个页面中输入他的凭据并返回一个JWT令牌(如果解码here1),则声明列出here2

此外,在具有[Authorize]标头和Authorization的请求中,此令牌在具有Bearer token属性的控制器中获得授权。

注意:以下常量取自Active Directory中注册的应用程序( Native Web App / API )。

public const string Authority = @"https://login.windows.net/******.com";
public const string GraphResource = @"https://*******.azurewebsites.net/********";
public const string ClientId = "046b****-****-****-****-********0290";
public const string Resource = @"https://******.azurewebsites.net/.auth/login/done";

var authContext = new AuthenticationContext(Authority);
if (authContext.TokenCache.ReadItems().Any(c => c.Authority == Authority))
{
    authContext = new AuthenticationContext(authContext.TokenCache.ReadItems().First().Authority);
}

var uri = new Uri(Resource);
var platformParams = new PlatformParameters(UIApplication.SharedApplication.KeyWindow.RootViewController);
AuthenticationResult authResult = await authContext.AcquireTokenAsync(GraphResource, ClientId, uri, platformParams);

我尝试过的另一个工作认证流程如下:它的相同之处在于它通知用户应用程序需要访问某些资源的权限。

如果允许,将返回JWT令牌(字符数少于前一个),其中有效负载数据较少。但是,此标记不会像上一个那样通过授权属性。

public const string AadResource = @"https://******.azurewebsites.net/.auth/aad";

var client = new MobileServiceClient(AadResource);
var rootView = UIApplication.SharedApplication.KeyWindow.RootViewController;
MobileServiceUser user = await client.LoginAsync(rootView, "aad");

显然,返回类型不同,但是,这两种身份验证方法之间的主要区别是什么

另外,另一个令人头疼的问题来自于在文章最后尝试实现this3。我已经拥有上述第一个方法中的令牌,但是当我尝试使用client.LoginAsync()中的令牌跟随客户端流时,会返回以下错误:

  

您要查找的资源已被删除,名称已更改或暂时无法使用。


链接参考:

  1. https://jwt.io/
  2. https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-token-and-claims
  3. https://adrianhall.github.io/develop-mobile-apps-with-csharp-and-azure/chapter2/enterprise/
  4. https://www.reddit.com/r/xamarindevelopers/comments/6dw928/differences_between_acquiretokenasync/

  5. 编辑(2017年5月30日)

    同一个人( pdx mobilist / saltydogdev )已在this4 reddit帖子上回复了Why are they different?,简单的答案是{ {1}}。

1 个答案:

答案 0 :(得分:1)

是。您可以将一个令牌插入MobileServicesClient,然后使用它直接进行身份验证。这是持票人代币的美丽。

只需设置MobileServiceClient CurrentUser:

即可
MobileServiceclient Client;
...
Client.CurrentUser = new MobileServiceUser(username) 
       { MobileServiceAuthenticationToken = authtoken};

编辑:

它们不同的原因是因为每个库都在请求一组不同的声明。他们仍然工作的原因是用于验证/验证令牌的基本信息就在那里。我不确定具体要求的具体内容是什么。至少是用户ID和签名有效。他们正在做同样的基本事情,MobileServiceClient只是要求更少的索赔。

如果您正确设置了移动服务,我相信MobileServicesClient可以针对Azure AD进行身份验证。所以你应该能够使用MobileServiceClient。

以下是描述其工作原理的文档:https://docs.microsoft.com/en-us/azure/app-service-mobile/app-service-mobile-how-to-configure-active-directory-authentication