MVC .NET-cookie authentifiziert system acessing eine Web-Api mit token-Authentifizierung
Habe ich ein Mvc 5 client, der eine Ownin cookie-Authentifizierung.
Ich habe auch eine Web-Api, die geschützt werden mit Owin Bearer-token (ich habe VS2013 Web-Api-Vorlage, die den Token-Endpunkt)
Ok, jetzt ist mein Mvc 5 client verwenden müssen, meine WebApi.
Ich schuf eine Methode, um die bearer-token:
internal async Task<string> GetBearerToken(string siteUrl, string Username, string Password)
{
HttpClient client = new HttpClient();
client.BaseAddress = new Uri(siteUrl);
client.DefaultRequestHeaders.Accept.Clear();
HttpContent requestContent = new StringContent("grant_type=password&username=" + Username + "&password=" + Password, Encoding.UTF8, "application/x-www-form-urlencoded");
HttpResponseMessage responseMessage = await client.PostAsync("Token", requestContent);
if (responseMessage.IsSuccessStatusCode)
{
TokenResponseModel response = await responseMessage.Content.ReadAsAsync<TokenResponseModel>();
return response.AccessToken;
}
return "";
}
Und in meiner Mvc action ich rief:
public async Task<ActionResult> Index()
{
var token = await GetBearerToken("http://localhost:6144/", "teste", "123456");
using (var client = new HttpClient())
{
client.DefaultRequestHeaders.Add("Authorization", "Bearer "+ token);
var response = await client.GetAsync("http://localhost:6144/api/values");
if (response.IsSuccessStatusCode)
{
var data = response.Content.ReadAsAsync<IEnumerable<string>>();
return Json(data.Result, JsonRequestBehavior.AllowGet);
}
}
}
Dass alles Prima funktioniert... Aber ich muss an die Web-Api in allen meinen Taten...
Also, wie kann ich halten, dass der token (trotz immer ein neues token für jeden request) und wie stellen Sie sicher, wenn es abgelaufen ist ... Ist es möglich zu halten, zusammen mit der Authentifizierung cookie irgendwie?
Best pratices zu befassen sich mit, Szenario?
Dank
InformationsquelleAutor der Frage Paul | 2014-03-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn ich es richtig MVC 5 client-app ist der Zugriff auf eine WebAPI von einer anderen app.
Das MVC 5 Client ein cookie verwendet, um den Benutzer zu authentifizieren. Zugriff auf die WebAPI erhalten Sie eine Inhaber-tokeen von der /Token-Endpunkt und senden Sie es in der Authorization-header.
Sie nicht, rufen Sie die WebAPI von Ihrem client-Seite Javascript-code, den Sie gerade nennen Sie es innerhalb von MVC-Aktionen auf dem server ausgeführt von MVC5 application.
Immer ein neues Token vor jedem service-Aufruf falsch klingt. Dies würde bedeuten, 2 Rundfahrten jedes mal. Dies kann nicht performant.
Wenn ich das Recht, Sie könnte:
Speichern der token in der Session-Objekt. Solange Ihre Benutzer die MVC-App authentifiziert und seine session am Leben ist, würden Sie dann immer die gleichen Token.
Wenn Ihr abgelaufen ist, erhalten Sie eine 401 unauthorized access wieder von der WebAPI.
Um Ihre MVC-Action-Unit-Testbar, könnten Sie wickeln die Sitzung Zugang zu einer Dienstleistung, die Sie injizieren in die Aktion (Dependency Injection).
könnten Sie speichern den Token in einem cookie ähnlich wie die cookie-Authentifizierung bereits bestehenden. Auf diese Weise würden Sie nicht brauchen, eine Sitzung auf der server-Seite. Hier würde ich wieder wickeln Sie den Zugang zu den Token aus dem Cookie in ein service, der alle Ihre Aktionen verwenden.
Würde ich die Session-Speicherung. Einfach. Straight forward.
Aber vielleicht bin ich etwas fehlt
Hoffe, dies hilft Ihnen.
Feedback willkommen 🙂
InformationsquelleAutor der Antwort PeterFromCologne
Bearer-token ist nicht ein guter Weg, um zu autorisieren, Ihre web-Anwendung. Wenn Sie store-Dienste " token im cookie verfügbar sein wird, um die Anwendung Klienten, so dass service-Schicht anfällig für Applikation-clients. Die einzige Lösung scheint zu sein, halten token in einer Sitzung, aber Sie verlieren staatenlos Art der Anwendung.
Hier ist describied was/wie bearer-token verwendet werden soll: "Ein bearer-token ist nur eine große, zufällige Zeichenfolge, die ein client muss auf jeder API-Aufruf. Bearer-Token sind einfach, da gibt es keine spezielle Signatur oder die Validierung code, der benötigt an beiden enden. Der Kunde ist verantwortlich für die Speicherung der token in einem sicheren Ort auf und sendet Sie mit jeder Anfrage. Der server ist verantwortlich für die Suche, bis Sie das token in einer Datenbank und macht Sie sicher, es ist ein gültiges ein-das ist es.".
Hier ist gutes Beispiel für die Nutzung bearer-token in single-page-Anwendungwo Kunden direkt spricht mit dem service.
Sowieso ich schlage vor, Sie verwenden HMAC-AuthentifizierungBCrypt oder ClientCertificates. Auch amazon verwendet es zur Authentifizierung REST-Anforderungen.
InformationsquelleAutor der Antwort jan salawa
Wenn Sie möchten, verwalten Sie das Token über alle Ihre Aktionen, sollten Sie ändern Sie den code, um eine benutzerdefinierte Autorisierungs-filter. Das filter kann Hinzugefügt werden, um alle Web-API-Anfragen, die alle Aktionen für einen controller, oder eine einzelne Aktion. Um das zu tun, stammen aus dem AuthorizeAttribute und Ausgabe der GetBearerToken rufen Sie aus dem filter. Kleben Sie das token in den HTTP-Kontext für die Verwendung bei der Verarbeitung von Anfragen. Statt direkt aufrufen, erstellen HttpClient-Instanzen, die Sie verwenden könnte, ein Werk zu erstellen, und fügen Sie die entsprechenden Token für die Authentifizierung.
Als für die Bestimmung, wenn die Gutscheine abgelaufen sind, fügen Sie einen zusätzlichen filter, der überprüft, ob bestimmte Fehler wieder kommen oder alternativ einen Scheck ausstellen der in der authorization-filter. Ich weiß nicht, alle Ihre Anforderungen, so dass es schwierig zu bestimmen, die entsprechende Lösung gibt.
InformationsquelleAutor der Antwort David Banister