In den letzten Tagen habe ich mit dem Micro Service Muster gespielt und alles läuft gut, aber die Sicherheit scheint mich zu verblüffen.Micro Service Sicherheit
Also, wenn ich eine Frage stellen kann: Wie handhabe ich die Benutzerauthentifizierung an einem einzelnen Dienst? Im Moment übergebe ich eine Anfrage an die
Gateway API
, die wiederum mit dem Dienst verbindet.
Frage Herausgegeben Siehe unten
Angesichts der Tatsache, dass die einzelnen Dienste, die nicht voneinander wissen sollten. Die Gateway
ist der Aggregator als solcher.
Aktuelle Architektur.
Ein kleiner Code, um die Anfrage zu simulieren:
Frontend - Client-App
public class EntityRepository<T>
{
private IGateway _gateway = null;
public EntityRepository(IGateway gateway)
{
this._gateway = gateway;
}
public IEnumerable<T> FindAll()
{
return this._gateway.Get(typeof(T)).Content.ReadAsAsync<IEnumerable<T>>().Result;
}
public T FindById(int id)
{
return this._gateway.Get(typeof(T)).Content.ReadAsAsync<T>().Result;
}
public void Add(T obj)
{
this._gateway.Post(typeof(T), obj);
}
public void Update(T obj)
{
this._gateway.Post(typeof(T), obj);
}
public void Save(T obj)
{
this._gateway.Post(typeof(T), obj);
}
}
//Logic lives elsewhere
public HttpResponseMessage Get(Type type)
{
return Connect().GetAsync(Path(type)).Result;
}
public HttpResponseMessage Post(Type type, dynamic obj)
{
return Connect().PostAsync(Path(type), obj);
}
private string Path(Type type)
{
var className = type.Name;
return "api/service/" + Application.Key + "/" + className;
}
private HttpClient Connect()
{
var client = new HttpClient();
client.BaseAddress = new Uri("X");
// Add an Accept header for JSON format.
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));
return client;
}
ich Generika verwenden, um festzustellen, wo sie es feuern muss einmal Hit das Tor . Wenn also die Type
Kategorie ist, wird es die Kategorie Service Feuer so rufen:
public IEnumerable<dynamic> FindAll(string appKey, string cls)
{
var response = ConnectTo.Service(appKey, cls);
return (appKey == Application.Key) ? (response.IsSuccessStatusCode) ? response.Content.ReadAsAsync<IEnumerable<dynamic>>().Result : null : null;
}
Das Gateway nicht die physischen Dateien/Class der Typen enthalten.
Nach ein wenig Code hatte ich gehofft, jemand könnte mir eine kleine Demonstration oder den besten Ansatz geben, Sicherheit/Benutzerauthentifizierung mit der aktuellen Architektur zu behandeln.
Case Scenario 1 Benutzer die Web-App trifft und meldet sich an diesem Punkt die Benutzer verschlüsselte E-Mail und Passwort an den Gateway API
gesendet wird, die dann an die User Service
geleitet wird und entscheidet, ob der Benutzer authentifiziert ist - alles gut und gut, aber jetzt möchte ich alle Nachrichten aus dem Message Service
abrufen, die der Benutzer erhalten hat. Ich kann wirklich nicht im Gateway sagen, wenn der Benutzer authentifiziert ist, um die Nachrichten holen, weil das das Problem nicht lösen von dem Aufruf der Message Service
außerhalb der Gateway API
Ich kann auch nicht hinzufügen Authentifizierung für jeden einzelnen Dienst, weil das all entsprechenden erfordern würde Dienste im Gespräch mit der User Service
und das schlägt den Zweck des Musters.
Fixes: Erlauben Sie dem Gateway nur, die Dienste anzurufen. Anfragen an Dienste außerhalb des Gateways sollten blockiert werden.
Ich weiß, Sicherheit ist ein weites Thema, aber im aktuellen Kontext hoffe ich, dass jemand mich mit der besten Vorgehensweise leiten könnte, um das Problem zu lösen.
Derzeit habe ich eine Guid
Hardcodiert in allen Anwendungen, die wiederum Daten abruft, wenn die App gleich ist.
Es gibt tausende Fragen zur Authentifizierung und Autorisierung, was hat Ihre Forschung gezeigt? Natürlich ist alles Statische (wie eine GUID) überhaupt keine Sicherheit, da jemand einfach die GUID aus dem Netzwerkverkehr schnüffeln und eine eigene App erstellen kann, die auch die gleiche GUID sendet. – CodeCaster
Ich bin vertraut mit Authentifizierung und Autorisierung in monolithischen Anwendungen. Die Architektur stellt Herausforderungen. Haben Sie die Micro Service-Architektur schon einmal implementiert? Guid Ansatz ist Temp. –
Müssen Sie Ihre Kunden (Apps) oder Ressourcenbesitzer authentifizieren? –