如何使用AAD

时间:2017-07-31 20:27:14

标签: c# xamarin.forms

我是移动应用程序的新手,最近又开了一个新项目。我正在开发一个Xamarin.Forms应用程序并尝试从Azure Active Directory获取访问令牌,以便能够访问其他服务器上的某些Web API服务。

使用下面的代码,我能够在控制台应用程序上获得响应,但不能从Xamarin.forms获得响应。 Q1。如何在PCL中实现此功能?

using Microsoft.IdentityModel.Clients.ActiveDirectory;
using Xamarin.Auth;
using Newtonsoft.Json;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Runtime.Serialization.Json;

internal class UtilityClass
{
    public static async Task<string> GetTokenAsync()
    {            
     var authenticationContext = new Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext(aadInstance, null);
        ClientCredential clientCredential = new ClientCredential(clientId, clientSecret);
        try
        {
            if (Token == null)
            {
                AuthenticationResult result = await authenticationContext.AcquireTokenAsync(audienceApi, clientCredential);
                if (result == null)
                    throw new InvalidOperationException("Failed to obtain the JWT token");
                Token = result.AccessToken;
            }

        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
        }
        return Token;
    }

    public async static Task<TReturn> CallApiAsync<TReturn>(string URI)
    {

        TReturn result = default(TReturn);

        HttpClient client = new HttpClient();
        client.MaxResponseContentBufferSize = 256000;
        client.BaseAddress = new Uri(audienceApi);
        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", await GetTokenAsync());


        var uri = new Uri(string.Format(URI, string.Empty));

        var response = await client.GetAsync(uri);
        if (response.IsSuccessStatusCode)
        {
            var content = await response.Content.ReadAsStringAsync();
            result = JsonConvert.DeserializeObject<TReturn>(content);
        }

        return result;
     }
  }

在我的PCL的app方法中,尝试以这种方式访问​​它

public App ()
{
    var CustomerContactList = UtilityClasses.CallApiAsync<List<CustomerContact>>(); 
}

Q2。我想在本地服务器上运行我的Web API服务并调试来自Xamarin.Forms App的调用,那么如何配置我的Visual Studio 2015和Android模拟器以访问https://localhost:PortNumber/api/getCustomerContacts

提前感谢您的支持

2 个答案:

答案 0 :(得分:0)

您需要配置本地IIS Express以处理它在外部IP上接收的请求,按照步骤here执行,如果您在评论中遇到问题则调试步骤

干杯

答案 1 :(得分:0)

  

Q1。如何在PCL中实现此功能?

如果您查看此链接,有些内容适合您 https://forums.xamarin.com/discussion/19021/using-xamarin-auth-with-xamarin-forms

使用以下redirectUrl替换auth并且authorizeUrl应该可以工作,尽管我还没有对此进行测试。

https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-protocols-oauth-code

var auth = new OAuth2Authenticator (
clientId: "clientId",
scope: "",
authorizeUrl: new Uri ("https://login.microsoftonline.com/{yourtenant}/oauth2/authorize?"),
redirectUrl: new Uri ("urn:ietf:wg:oauth:2.0:oob"));
  

Q2。我想在本地服务器上运行我的Web API服务并调试来自Xamarin.Forms应用程序的调用,那么如何配置我的Visual Studio 2015和Android模拟器以访问https://localhost:PortNumber/api/getCustomerContacts

在您的IIS中,在特定端口公开您的本地网站,然后在您的Android模拟器中,您可以使用

https://10.0.2.2:portNumber/api/getCustomerContacts