2017-01-07 6 views
1

Xamarin Formsアプリケーションを認証しようとしていますが、Windows名前空間クラスとメソッドの代わりにWebAuthenticationBroker.GetCurrentApplicationCallbackUriの代替を見つけることができません。XamarinはWebAuthenticationBrokerと同等です。GetCurrentApplicationCallbackUri?

Xamarin Forms UWPアプリでは、RedirectURLを取得するために使用できますが、iOSとAndroidアプリについてどうすればよいか分かりません。 :

class Authenticator : IAuthenticator 
{ 

    /// <summary> 
    /// Address to return to upon receiving a response from the authority. 
    /// </summary> 
    private static readonly Uri RedirectURI = WebAuthenticationBroker.GetCurrentApplicationCallbackUri(); 


    public async Task<AuthenticationResult> AuthenticateAsync(UserLogOn user, string authority, string resource, Uri redirectURI, string clientId) 
    { 
     PlatformParameters platformParams = new PlatformParameters(PromptBehavior.Always, false); 

     try 
     { 

      var authContext = new AuthenticationContext(authority); 

      var authResult = await authContext.AcquireTokenAsync(resource, clientId, RedirectURI, platformParams); 
      return authResult; 
     } 
     catch (Exception e) 
     { 
      Debug.WriteLine($"AquireTokenAsync Error: {e.Message}"); 
      return null; 
     } 
    } 
} 

は、それは私が私たちのAzure ADアカウントにアクセス許可の問題を持っていたことが判明し、それを解決した後に、これは私が使用して終了することをAndroidとiOSのためのソリューションである、 マーク

+0

今のところ、いくつかの詳細が欠落しているので、良い質問をするのは難しいです。どのライブラリを認証に使用していますか? 'Xamarin.Auth'?あなたはUWPのために表示しているコードですか? – Demitrian

+0

はい、それはUWPコードです。私はADAL:Microsoft.IdentityModel.Clients.ActiveDirectoryを使用しています。 Xamarin.Authは2年以上も触れられていないように見えるので、私はそれを使いたいとは思っていません。しかし、私は柔軟です。主なことは、すべての適切な情報を持つトークンバックが必要であり、GetCurrentApplicationCallbackUriメソッドが明らかにアプリケーションのWindow Store IDとRedirectURLを関連付けることです。だから、iOSとAndroidアプリのために、iOSとAndroidの中からGetCurrentApplicationCallbackUriメソッドを使う方法を理解する必要があると思います。 –

+0

@MarkGarcia Xamarin Authライブラリは古いものがあるので混乱していますが、[this](https://www.nuget.org/packages/Xamarin.Auth/)のバージョンは定期的に入手できます更新。 – hvaughan3

答えて

0

をありがとう

このリダイレクトURIをAzure AD App登録に追加し、Windows専用のメソッドに置き換えてください。GetCurrentApplicationCallbackUriはトリックを行いました。ここで

/// <summary> 
/// Redirect URI for Android and iOS. 
/// </summary> 
public static Uri RedirectURI = new Uri("http://AppNamespace.azurewebsites.net/local"); 

、私は、プロジェクト内のインタフェースを使用:

アンドロイド

class Authenticator : IAuthenticator 
{ 
    public async Task<AuthenticationResult> AuthenticateAsync(UserLogOn user, string authority, string resource, Uri redirectURI, string clientId) 
    { 
     try 
     { 
      var authContext = new AuthenticationContext(authority); 

       var authResult = await authContext.AcquireTokenAsync(resource, clientId, redirectURI, new PlatformParameters((Activity)Forms.Context)); 

       return authResult; 
     } 
     catch (Exception) 
     { 
      return null; 
     } 
    } 
} 

をiOSの

class Authenticator : IAuthenticator 
{ 
    public async Task<AuthenticationResult> AuthenticateAsync(UserLogOn user, string authority, string resource, Uri redirectURI, string clientId) 
    { 
     try 
     { 
      var authContext = new AuthenticationContext(authority); 

      var authResult = await authContext.AcquireTokenAsync(resource, clientId, redirectURI, 
       new PlatformParameters(UIApplication.SharedApplication.KeyWindow.RootViewController)); 

      return authResult; 
     } 
     catch (Exception) 
     { 
      throw; 
     } 
    } 
} 

そして最終的に私はインターフェイスを呼び出すために、この行を使用:

var authResult = await DependencyService.Get<IAuthenticator>().AuthenticateAsync(user, QueryParameters.Authority, QueryParameters.GraphResourceUri, QueryParameters.RedirectURI, QueryParameters.ClientId);