2016-12-07 5 views
0

Hallo Ich versuche zu speichern Benutzer in einer Xamarin App eingeloggt bleiben.Wie man den Benutzer anmeldet xamarin

Die offiziellen Tutorials darüber sprechen, wie die Anmeldung aber nicht, wie Benutzer angemeldet zu halten. Microsoft Tutorial xamarin Tutorial

Mein Problem ist, dass die Login-Methode jedes Mal ausgeführt wird, muss die App gestartet wird, ist die bis bringt ein leerer Bildschirm für eine Weile, bevor es ausgeht.

Anmeldung Methode

async void Login() 
     { 
      if(App.Authenticator != null && authenticated == false) 
      { 
       authenticated = await App.Authenticator.Authenticate(); 
      } 
     } 

Authentifizieren Methode

public async Task<bool> Authenticate() 
     { 
      var success = false; 
      var message = string.Empty; 

      try 
      { 

        //Sign in with Active Directory Service 
       user = await ShopItemManager.DefaultManager.CurrentClient.LoginAsync(this, 
        MobileServiceAuthenticationProvider.WindowsAzureActiveDirectory); 



       if (user != null) 
       { 
        message = string.Format("You are now signed in as {0}", user.UserId); 
        success = true; 
        //store token 
       } 
      } 
      catch (Exception ex) 
      { 
       message = ex.Message; 
      } 

      //Display the success or failure message 
      AlertDialog.Builder builder = new AlertDialog.Builder(this); 
      builder.SetMessage(message); 
      builder.SetTitle("Sign-in Result"); 
      builder.Create().Show(); 

      return success; 
     } 
+0

Haben Sie versucht, eine Art Login-Cookie zu setzen? –

+0

Ich würde aber ich habe wirklich keine Ahnung wie. – xerotolerant

+0

https://developer.xamarin.com/api/property/System.Web.HttpRequest.Cookies/ –

Antwort

0

nicht viel über Xamrin wissen Sie aber in nativer Android verwenden wir SharedPreferences Zustand anmelden, um zu speichern. SharedPreferences werden in Androide verwendet, um einige Daten in der Praxis zu speichern (d. H. Nach dem Schließen der Anwendung bleibt sie bestehen). Wir können einen Boolean setzen, um festzustellen, ob der Benutzer beim nächsten Start erfolgreich angemeldet ist.

Das Xamarin.Android-Äquivalent von SharedPreferences ist eine Schnittstelle namens ISharedPreferences.

Verwenden Sie es auf die gleiche Weise, und Sie können problemlos Android-Code portieren.


Zum Beispiel ein true/false bool speichern einige Context verwenden Sie folgendes tun:

ISharedPreferences prefs = PreferenceManager.GetDefaultSharedPreferences (mContext); 
ISharedPreferencesEditor editor = prefs.Edit(); 
editor.PutBoolean ("key_login_successfully", true); 
// editor.Commit(); // applies changes synchronously on older APIs 
editor.Apply();  // applies changes asynchronously on newer APIs 

Zugriff gespeicherten Werte mit:

ISharedPreferences prefs = PreferenceManager.GetDefaultSharedPreferences (mContext); 
mBool = prefs.GetBoolean ("key_login_successfully", <default value>); 

Aus diesem Beispiel: Wenn Sie die richtige C# -Schnittstelle kennen, können Sie sehen, dass der Rest einfach ist. Es gibt viele Android-Java-Beispiele zur Verwendung von SharedPreferences für komplexere Situationen, und diese können sehr einfach mit ISharedPreferences portiert werden.

Weitere Informationen finden Sie in diesem Thread:

+0

Das ist, was ich als nächstes vorhabe. Das Problem ist, dass der Benutzer nicht angemeldet ist, wenn die App neu gestartet wird. Auf die Azure Mobile App API kann die Anwendung erst zugreifen, wenn ich die Anmeldemethode erneut ausgeführt habe. – xerotolerant

+0

Ich bin mir nicht sicher über Azure Mobile App API. Aber um den weißen Bildschirm zu vertuschen, können Sie versuchen, einen Hintergrund für den Splash-Screen einzustellen und versuchen, eine Fortschrittsleiste zu zeigen, damit der Benutzer erfährt, dass etwas vor sich geht. – Nitesh

+0

Ich habe endlich eine Lösung gefunden, die sich auf das bezieht, was Sie erwähnt haben. Aber aufgrund von Xamarin- und Azur-spezifischen Merkmalen war es ein ziemlich komplizierter Prozess. Danke für den Vorschlag. – xerotolerant

0

So This tutorial die Informationen in sich hat. Es ist ein bisschen involviert.

Dieser Code speichert den Schlüssel. Was ein anderer Benutzer tatsächlich erwähnt hat. Obwohl dies plattformübergreifend ist. öffentliche statische Klasse Einstellungen { private statische ISettings AppSettings => CrossSettings.Current;

const string UserIdKey = "userid"; 
    static readonly string UserIdDefault = string.Empty; 

    const string AuthTokenKey = "authtoken"; 
    static readonly string AuthTokenDefault = string.Empty; 

    public static string AuthToken 
    { 
     get { return AppSettings.GetValueOrDefault<string>(AuthTokenKey, AuthTokenDefault); } 
     set { AppSettings.AddOrUpdateValue<string>(AuthTokenKey, value); } 
    } 

    public static string UserId 
    { 
     get { return AppSettings.GetValueOrDefault<string>(UserIdKey, UserIdDefault); } 
     set { AppSettings.AddOrUpdateValue<string>(UserIdKey, value); } 
    } 

    public static bool IsLoggedIn => !string.IsNullOrWhiteSpace(UserId); 
} 

jedoch dieser Auth-Handler, wenn sie mit dem Client-Konstruktor übergeben wird sichergestellt, dass die gespeicherten Anmeldeinformationen verwendet werden, wenn überhaupt gespeichert werden.

class AuthHandler : DelegatingHandler 
{ 
    public IMobileServiceClient Client { get; set; } 

    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) 
    { 
     if (this.Client == null) 
     { 
      throw new InvalidOperationException("Make sure to set the 'Client' property in this handler before using it."); 
     } 

     // Cloning the request, in case we need to send it again 
     var clonedRequest = await CloneRequest(request); 
     var response = await base.SendAsync(clonedRequest, cancellationToken); 

     if (response.StatusCode == HttpStatusCode.Unauthorized) 
     { 
      // Oh no! user is not logged in - we got a 401 
      // Log them in, this time hardcoded with MicrosoftAccount but you would 
      // trigger the login presentation in your application 
      try 
      { 
       var user = await this.Client.LoginAsync(MobileServiceAuthenticationProvider.MicrosoftAccount, null); 
       // we're now logged in again. 

       // Clone the request 
       clonedRequest = await CloneRequest(request); 


       Settings.UserId = user.UserId; 
       Settings.AuthToken = user.MobileServiceAuthenticationToken; 

       clonedRequest.Headers.Remove("X-ZUMO-AUTH"); 
       // Set the authentication header 
       clonedRequest.Headers.Add("X-ZUMO-AUTH", user.MobileServiceAuthenticationToken); 

       // Resend the request 
       response = await base.SendAsync(clonedRequest, cancellationToken); 
      } 
      catch (InvalidOperationException) 
      { 
       // user cancelled auth, so let’s return the original response 
       return response; 
      } 
     } 

     return response; 
    } 

    private async Task<HttpRequestMessage> CloneRequest(HttpRequestMessage request) 
    { 
     var result = new HttpRequestMessage(request.Method, request.RequestUri); 
     foreach (var header in request.Headers) 
     { 
      result.Headers.Add(header.Key, header.Value); 
     } 

     if (request.Content != null && request.Content.Headers.ContentType != null) 
     { 
      var requestBody = await request.Content.ReadAsStringAsync(); 
      var mediaType = request.Content.Headers.ContentType.MediaType; 
      result.Content = new StringContent(requestBody, Encoding.UTF8, mediaType); 
      foreach (var header in request.Content.Headers) 
      { 
       if (!header.Key.Equals("Content-Type", StringComparison.OrdinalIgnoreCase)) 
       { 
        result.Content.Headers.Add(header.Key, header.Value); 
       } 


    } 
    } 

    return result; 
} 
} 
Verwandte Themen