0

Ich lese diese beiden Artikel 1. here und 2. here, um herauszufinden, was die beste Möglichkeit ist, Authentifizierung gegen eine Azure Mobile App durchzuführen, wenn die API auf dem Server Claims-basierte benutzerdefinierte Autorisierung verwendet Der Xamarin-Client, der es aufruft, verwendet das MobileServiceClient Framework. Ich kann nicht abschließen, welches der beiden Beispiele in diesen Links der bessere Weg ist.Azure Mobile App Authentifizierung mit Xamarin

Im ersten Link scheint keine Abhängigkeit vom plattformspezifischen Code zu bestehen wie im zweiten Link, was bedeutet, dass ich keinen Code in die Driod- oder IOS- oder Windows-Projekte schreiben muss und kann kommen Sie mit allem in einer Klassenbibliothek selbst. (Bin ich hier richtig?) Auch die erste Verbindung scheint keinen Anbieter wie die zweite Verbindung zu tun, weil ich eine direkte Service-Aufruf an eine URL aufrufen. Der zweite Link scheint dagegen nur Facebook, Twitter, MicrosoftAccount, Google and WindowsAzureActiveDirectory zu unterstützen. Der obligatorische Parameter MobileServiceAuthenticationProvider scheint keine benutzerdefinierte Authentifizierung für eine sql-Server-basierte Benutzertabelle zu bieten. Ich bin mir über diesen Teil nicht sicher und finde keine Dokumentation, die etwas anderes sagt.

Wenn LoginAsync bietet keine benutzerdefinierte Authentifizierung dann ist klar, dass ich die Route InvokeApiAsync folgen muss. Wenn es das tut, dann ist die Frage: sollte ich plattformspezifischen (Droid/IOS/Windows) Code in jedes Zielprojekt wie in der zweiten Verbindung schreiben oder sollte ich alle Dienstaufrufe in einer Klassenbibliothek behandeln, wie es in der Beispiel in der ersten Verbindung gezeigt? Mit anderen Worten sollte ich mit LoginAsync oder InvokeApiAsync gehen? Welcher der beiden ist der empfohlene Weg?

Antwort

2

Der erste Artikel zeigt benutzerdefinierte Authentifizierung, wie Sie angedeutet haben. Der zweite Artikel zeigt App Service Authentication mit einer bekannten Liste. Wenn Sie einen benutzerdefinierten Benutzernamen/ein Passwort benötigen, dann gehen Sie mit dem ehemaligen. Wenn Sie mit "Auth" oder "Enterprise Auth" arbeiten müssen, dann gehen Sie mit Letzterem.

Meine allgemeine Empfehlung ist, dass der Benutzer keinen weiteren Benutzernamen erstellen muss, es sei denn, Sie müssen dies tun. Dies bedeutet soziale Authentifizierung für Consumer-Apps und Unternehmensauthentifizierung über AAD für Unternehmensanwendungen.

Meine andere Empfehlung ist, immer das Client-SDK für die Authentifizierung zu verwenden. Dadurch können Sie die neuesten Praktiken des Anbieters (Facebook, Twitter usw.) in Bezug auf Sicherheit, Aktualisierungstoken und andere Authentifizierungsanforderungen verfolgen. Sobald Sie das Provider-Token haben, können Sie es leicht gegen ein Azure Mobile-Token austauschen, indem Sie LoginAsync() mit einem Token verwenden. Informationen hierzu finden Sie unter Azure Documentation.

In allen Fällen benötigen Sie einen plattformspezifischen Code - das heißt, Sie verwenden den DependencyService (wie im zweiten Beispiel), um Ihren Login-Code auszuführen. Ich erstelle normalerweise eine Singleton-Klasse, die den MobileServiceClient in der PCL umschließt. Erstellen Sie dann eine ILoginProvider-Schnittstelle, die über LoginAsync/LogoutAsync-Code verfügt, um den Plattformabhängigkeitscode zu verarbeiten. Meine Singleton-Klasse ruft dann den DependencyService auf, um den Code abzurufen. Sie können ein Beispiel in meinem finden, das iOS, Android und UWP abdeckt.

+0

Können Sie ein beliebiges Muster zur Abdeckung beider Login-Typen empfehlen? Ich versuche derzeit, die gesamte Authentifizierung zu einer separaten Klassenbibliothek zu abstrahieren, habe aber Probleme damit, da ich eine 'Auth'-Schnittstelle in der Base-Portable-Bibliotheksklasse definieren muss, die gerätespezifische Implementierungen dieser Schnittstelle von jedem der Zielprojekte abruft (.Droid/.IOS/usw.) Jetzt befindet sich meine benutzerdefinierte Authentifizierung alleine in dieser Klassenbibliothek, während der andere Azure-Provider-bezogene Login-Code auf den Rest der Lösung verteilt ist. – user20358

+0

Ich musste die Klassenbibliothek für die Authentifizierung verlassen und diesen Code in das portable Projekt selbst einfügen. Ich bin mir nicht sicher, ob das ein gutes Design ist. – user20358

+0

Ich stelle meine ILoginProvider-Schnittstelle (die Basisschnittstelle, die der plattformspezifische Code implementiert) in die Basisklasse ein - keine Notwendigkeit für eine separate PCL. So ziemlich der ganze Code, den ich schreibe, ist in der PCL. –