拍在与Azure的AD B2C到Xamarin的Android应用

问题描述:

研究会使用Xamarin瞄准Android平台(不Xamarin.Forms)与Azure的AD B2C认证工作原则,一个星期后,我终于问了一小咨询。拍在与Azure的AD B2C到Xamarin的Android应用

我有一个活动“登录”按钮,我想登录到Azure的按钮的触摸事件。理想情况下,我想在登录步骤完成后收到令牌。

这里是我到目前为止的代码:我已经把一切都在同一个班,现在

public class MainActivity : Activity 
{ 
    public TaskCompletionSource<bool> ActivityResult { get; set; } 
    public const int LocationActivityResult = 110; 
    private static string AadInstance = "https://login.microsoftonline.com/{0}.onmicrosoft.com/"; 

    private PublicClientApplication _publicClientApplication; 
    private string _authority; 
    protected override void OnCreate(Bundle bundle) 
    { 
     base.OnCreate(bundle); 

     // Set our view from the "main" layout resource 
     SetContentView(Resource.Layout.Main); 

     //partie pour le sign in 

     EditText editTextEmail = FindViewById<EditText>(Resource.Id.editTextEmail); 
     EditText editTextPassword = FindViewById<EditText>(Resource.Id.editTextPassword); 
     Button signIn = FindViewById<Button>(Resource.Id.buttonSignIn); 

     signIn.Click += async (sender, e) => 
     { 

      ConnectivityManager connectivityManager = (ConnectivityManager)GetSystemService(ConnectivityService); 
      NetworkInfo networkInfo = connectivityManager.ActiveNetworkInfo; 
      if (networkInfo == null) 
      { 
       Toast.MakeText(this, "Aucune connexion internet", ToastLength.Short).Show(); 
       Intent intent = new Intent(this.ApplicationContext, typeof(NotInternetActivity)); 
       intent.SetFlags(ActivityFlags.NewTask); 
       StartActivity(intent); 
      } 
      else 
      { 

       /////essai pour la connexion 
       _authority = string.Format(AadInstance, _azureSettings.Tenant); 
       _publicClientApplication = new PublicClientApplication(
        _authority, 
        _azureSettings.ClientId 

       ); 
       await AcquireTokenAsync(); 

       /////passe sur la nouvelle actvité 

       Intent intent = new Intent(this.ApplicationContext, typeof(PlantsActivity)); 
       intent.SetFlags(ActivityFlags.NewTask); 
       StartActivity(intent); 

      } 

     }; 

    } 
    Authentication _azureSettings = new Authentication 
    { 
     ClientId = "ClientId", 
     ForgotPasswordPolicy = "ForgotPasswordPolicy", 
     SignInOrSignUpPolicy = "SignInOrSignUpPolicy", 
     Tenant = "Tenant" 

    }; 

    protected override void OnActivityResult(int requestCode, [GeneratedEnum] Result resultCode, Intent data) 
    { 
     base.OnActivityResult(requestCode, resultCode, data); 
     if (requestCode.Equals(LocationActivityResult)) 
     { 
      if (CrossGeolocator.Current.IsGeolocationEnabled) 
       this.ActivityResult.TrySetResult(true); 
      else 
       this.ActivityResult.TrySetResult(false); 
     } 
     else 
     { 
      AuthenticationAgentContinuationHelper.SetAuthenticationAgentContinuationEventArgs(requestCode, resultCode, data); 
     } 
    } 

    public class Authentication 
    { 
     public string Tenant { get; set; } 
     public string ClientId { get; set; } 
     public string SignInOrSignUpPolicy { get; set; } 
     public string ForgotPasswordPolicy { get; set; } 
    } 

    public Task<AuthenticationResult> AcquireTokenSilentAsync() 
    { 
     string[] scopes = { _azureSettings.ClientId }; 
     var res = _publicClientApplication.AcquireTokenSilentAsync(scopes, "", _authority, _azureSettings.SignInOrSignUpPolicy, false); 
     return _publicClientApplication.AcquireTokenSilentAsync(scopes, "", _authority, _azureSettings.SignInOrSignUpPolicy, false); 
    } 

    public async Task<AuthenticationResult> AcquireTokenAsync() 
    { 
     string[] scopes = { _azureSettings.ClientId }; 
     return await _publicClientApplication.AcquireTokenAsync(scopes, "", UiOptions.SelectAccount, string.Empty, null, _authority, _azureSettings.SignInOrSignUpPolicy); 
    } 
} 

,只是为了测试的结果。任何你可以给我的例子或Xamarin.Android上的任何文档,你可以指点我也会很有帮助。

在此先感谢。

该代码看起来使用MSAL .NET与Azure的AD B2C在正确的轨道上。

值得大声呼喊的唯一的事情是您的应用程序使用AcquireTokenAsyncAcquireTokenSilentAsync。一般来说,最好的模式是进行静默调用(它将检查令牌缓存中的令牌,如果无法获得有效的访问令牌则会失败),然后在调用正常AcquireTokenAsync时失败。

这将使得具有有效令牌的用户在每次打开应用程序或您的应用程序需要令牌时都不必一次又一次登录。

微软有一个代码示例,演示如何use MSAL .NET (Xamarin) with Azure AD B2C。与往常一样,B2C Developer Guide是查找文档的好地方。

+0

嗨Dobalian先生, 要开始感谢正常访问您轻松表你的快速答案,这是一个很好的评论,但事情是,我试图找到一个XAMARIN.ANDROID模板,并且你提供给我的是一个XAMARIN.FORMS示例。但MSAL关键字将帮助我进行期货搜索。 我读了很多关于AcquireTokenAsync和AcquireTokenSilentAsync的文档,它在xamarin.forms上工作得很好,但我在xamarin.android –

+0

中找不到类似的东西。为了完成,我检查了你给我的示例,它使用了xamarin形式,这意味着我没有访问App.xaml.cs(实际上这不是一个大问题),但这就是为什么我要求帮助,如果我能找到一个使用它可能是完美的例子,事实上我可以应用 再次欢呼=) –

+0

没有官方示例没有为MSAL使用Xamarin表单,但我已转发请求。如果遇到不使用表单的问题,请随时提出新问题,我们将确保回答它们! –

所以愿意花星期后,我终于能够做到这一点。

因此,我的应用程序现在有一个Azure AD B2C后端,我可以从Xamarin Android(本机)应用程序进行身份验证,并从我的Easy Tables访问数据。

这里是它如何工作的:

你需要的第一件事是让来自Azure的B2C的道理,所以一旦它是全成,然后authResult将举行在这里您可以访问令牌和用户名新用户。

PublicClientApplication publicClientApplication = new PublicClientApplication(AuthParameters.Authority, AuthParameters.ClientId); 
var authResult = await publicClientApplication.AcquireTokenSilentAsync(AuthParameters.Scopes, "", AuthParameters.Authority, AuthParameters.Policy, false); 
//  await Navigation.PushAsync(new SecurePage()); 
var result = authResult.Token; 

      textbox.Text = authResult.User.Name; 

第二件事是令牌发送到通过loginasync您mobileserviceclient ..

JObject payload = new JObject(); 
payload["access_token"] = authResult.Token; 
try 
{ 
    var user = await MobileService.LoginAsync(MobileServiceAuthenticationProvider.WindowsAzureActiveDirectory, payload); 
} 

这是类AuthParameters存储数据所需:

public class AuthParameters 
{ 
    public const string Authority = "https://login.microsoftonline.com/YOURSITE.onmicrosoft.com/"; 
    public const string ClientId = "Client ID from B2C APP"; 
    public static readonly string[] Scopes = { ClientId }; 
    public const string Policy = "POLICY_NAME_FROM_B2CTenant"; 
} 

现在在Azure门户您应该拥有一个活动的Azure B2C应用程序和一个移动服务客户端。他们应该被连接在一起,将它们连接的方式是通过这个链接

https://developer.xamarin.com/guides/xamarin-forms/cloud-services/authentication/azure-ad-b2c-mobile-app/

现在,你应该能够通过MobileServiceClient