AuthenticationContext.AcquireTokenAsync是C#的新手

我是Azure新手,希望能够以编程方式从Azure获取令牌。 无论我做什么,它似乎都失败了 – 有没有人有一个有效的例子? 多谢你们

我调用GetAToken().Wait();

方法是:

 public async Task GetAToken() { // authentication parameters string clientID = "*********"; string username = ""; string password = ""; string directoryName = ""; ClientCredential cc = new ClientCredential(clientID, password); var authenticationContext = new AuthenticationContext("https://login.windows.net/" + directoryName); AuthenticationResult result = await authenticationContext.AcquireTokenAsync("https://management.core.windows.net/", cc); if (result == null) { throw new InvalidOperationException("Failed to obtain the JWT token"); } string token = result.AccessToken; return token; } 

所以不确定你是否在Android,iOS或Xamarin.Forms上这样做。 下面是我将如何使用ADAL和Azure进行身份validation(代码正在我的工作中):

在Android上:

 public async Task Authenticate(Activity context, string authority, string resource, string clientId, string returnUri) { var authContext = new AuthenticationContext(authority); if (authContext.TokenCache.ReadItems().Any()) authContext = new AuthenticationContext(authContext.TokenCache.ReadItems().First().Authority); var uri = new Uri(returnUri); var platformParams = new PlatformParameters(context); try { var authResult = await authContext.AcquireTokenAsync(resource, clientId, uri, platformParams); return authResult; } catch (AdalException e) { return null; } } 

在iOS上:

 public async Task Authenticate(UIViewController controller, string authority, string resource, string clientId, string returnUri) { var authContext = new AuthenticationContext(authority); if (authContext.TokenCache.ReadItems().Any()) authContext = new AuthenticationContext(authContext.TokenCache.ReadItems().First().Authority); var controller = UIApplication.SharedApplication.KeyWindow.RootViewController; var uri = new Uri(returnUri); var platformParams = new PlatformParameters(controller); try { var authResult = await authContext.AcquireTokenAsync(resource, clientId, uri, platformParams); return authResult; } catch (AdalException e) { return null; } } 

在UWP上 :

 public async Task Authenticate(string authority, string resource, string clientId, string returnUri) { var authContext = new AuthenticationContext(authority); if (authContext.TokenCache.ReadItems().Any()) authContext = new AuthenticationContext(authContext.TokenCache.ReadItems().First().Authority); var uri = new Uri(returnUri); var platformParams = new PlatformParameters(PromptBehavior.Auto); try { var authResult = await authContext.AcquireTokenAsync(resource, clientId, uri, platformParams); return authResult; } catch (AdalException e) { return null; } } 

我传入上述方法的变量:

 string authority = "https://login.windows.net/common"; string ResourceID = "Backend ClientId";//Backend (web app) string clientId = "Native App ClientId";//native app string returnUri = "https://{My Azure Site}.azurewebsites.net/.auth/login/done"; 

如果你想在Xamarin.Forms中这样做,下面是我的GitHub解决方案的链接,我通过DependencyService公开了这些方法。

  • PCL实施
  • iOS实现
  • Android实施

我希望这有帮助! 如果您的响应中出现任何错误,请检查以确保您在Azure中正确设置了权限。 我是这样做的 。 另一个很好的资源是Adrian Hall的Xamarin / Azure书

编辑:添加了UWP的东西

如果你要做的就是像你一样调用Azure API,那么你应该做一些不同的事情。

  1. 在Azure AD中创建具有访问Azure API权限的应用程序
    1. 如果要调用Service Management API,请将其添加为权限
      1. 您也可以使用管理证书
    2. 如果要调用Resource Management API,请通过新Portal添加服务主体所需的权限
  2. 如果您为Service Management API选择了委派方式(第一个选项),那么您将必须:
    1. 让用户使用授权代码授权流程对Azure AD进行身份validation
    2. 或者使用密码授权流程获取访问令牌(您可以在另一个答案中看到此示例)
  3. 如果您选择管理证书或授予服务主体权限,则可以使用客户端凭据授予流程直接从Azure AD获取访问令牌

最后,您将始终使用可用于调用API的访问令牌。