gpt4 book ai didi

c# - Xamarin Native 中 AcquireTokenAsync 和 LoginAsync 之间的差异

转载 作者:太空宇宙 更新时间:2023-11-03 12:27:20 25 4
gpt4 key购买 nike

TL;DR

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


长版

我一直在尝试使用 Xamarin 通过 移动设备 (iOS) 对 Azure 中的移动服务进行用户身份验证 native (不是表单)。

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

目前有效的方法如下;它让用户在另一个页面中输入他的凭据并返回一个 JWT token ,该 token (如果解码 here1 )具有列出的声明 here2 .

此外,此 token 在 Controller 中通过带有 Authorization header 和 Bearer token 的请求中的 [Authorize] 属性进行授权。

注意:以下常量取自 Active Directory 中注册的应用程序( native Web 应用程序/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 token (字符数比前一个 token 少),并包含较少的有效负载数据。不过,此 token 不会像前一个 token 一样传递授权属性。

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在文章的最后。我已经从上述第一个方法中获得了 token ,但是当我尝试使用 client.LoginAsync() 中的 token 跟踪客户端流程时,会返回以下错误:

The resource you are looking for has been removed, had its name changed, or is temporarily unavailable.


链接引用:

  1. https://jwt.io/
  2. https://learn.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/

编辑(2017 年 5 月 30 日)

为什么它们不同?已在 this4 上得到解答同一个人(pdx mobilist/saltydogdev)在 reddit 上发帖,简单的答案是声明

最佳答案

是的。您可以将 token 插入 MobileServicesClient 中,然后直接使用已通过身份验证的 token 。这就是不记名 token 的美妙之处。

只需设置 MobileServiceClient CurrentUser:

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

编辑:

它们不同的原因是每个图书馆都请求一组不同的声明。它们仍然有效的原因是用于验证/验证 token 的基本信息就在那里。我不确定具体要求的 claim 是什么。至少是用户 ID 并且签名有效。他们正在做相同的基本事情,MobileServiceClient 只是请求更少的声明。

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

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

关于c# - Xamarin Native 中 AcquireTokenAsync 和 LoginAsync 之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44199525/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com