使用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()
中的令牌跟随客户端流时,会返回以下错误:
您要查找的资源已被删除,名称已更改或暂时无法使用。
同一个人( pdx mobilist / saltydogdev )已在this4 reddit帖子上回复了Why are they different?
,简单的答案是{ {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