我是移动应用程序的新手,最近又开了一个新项目。我正在开发一个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?
提前感谢您的支持
答案 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应该可以工作,尽管我还没有对此进行测试。
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模拟器中,您可以使用