2017-10-13 5 views
0

Ich habe eine .net Kern + eckige Anwendung, die keine Login-Funktionalität hat. Ich brauche keine Anmeldung, aber ich möchte eine "Admin Panel" -Funktionalität haben.Asp.Net Core + Angular = Schützen Api ohne Login

Zum Beispiel möchte ich Beiträge zu meiner Website hinzufügen.

Ich verstehe, dass ich nicht api/addpost/myPassword oder was auch immer komplexe Zeichenfolge nur von mir bekannt, weil es Möglichkeiten gibt, das zu sehen. Wie kann ich meine API schützen, ohne die Register/Login-Funktionalität zu implementieren?

Danke!

+0

Lassen Sie mich versuchen, dies zu verstehen, indem Sie Ihre Frage neu formulieren. Sie möchten Ihren Serviceendpunkt schützen können, damit er nicht außerhalb Ihrer Anwendung aufgerufen werden kann, aber Sie möchten die Anmelde-/Registerfunktionalität nicht implementieren? Ist es das, was du meintest? – eminlala

+0

Ja, ich möchte die einzige Person sein, die Beiträge zum Beispiel hinzufügen kann. Und ich möchte die Register/Login-Funktionalität nur dafür implementieren. Es wird nett sein, wenn du von außerhalb der Anwendung auf diesen Dienst zugreifen kannst (vielleicht werde ich einen Moderator einstellen, der Beiträge hinzufügen kann ... also kann ich ihm die "Schlüssel" geben, um nur auf diese API zuzugreifen, aber jetzt ist es in Ordnung, das nicht zu tun außerhalb der Anwendung zugegriffen werden) – Marian

Antwort

0

Es gibt einige Dinge, die Sie tun können.

Am einfachsten können Sie eine benutzerdefinierte ActionFilterAttribute erstellen, die Ihren Serviceaufruf validiert, bevor Sie Ihre API-Controller-Methode eingeben.

Ich habe hier einen Guid Wert verwendet, aber Sie können alles verwenden.

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)] 
public sealed class CustomValidateRequestAttribute : ActionFilterAttribute 
{ 

    public override void OnActionExecuting(HttpActionContext actionContext) 
    { 
      var headerValue = actionContext.Request.Headers.FirstOrDefault(item => item.Key == "validation-value").Value?.FirstOrDefault(); 
      Guid guidValidationValue; 

      if (string.IsNullOrWhiteSpace(headerValue) && !Guid.TryParse(headerValue , out guidValidationValue)) 
      { 
       throw new UnauthorizedAccessException(); 
      } 

      base.OnActionExecuting(actionContext); 
     } 
    } 

Sie dieses benutzerdefinierte Attribut auf Ihre AddPost Methode in der API-Controller hinzufügen.

In Ihrem Dienst auf der Client-Seite müssen Sie diesen Header-Wert zu den Headern hinzufügen. Etwas wie:

addPosts(url, data) { 
    let headers = new Headers(); 
    headers.append('validation-value', 'your-guid-value-or-something-else'); 
    return this.http.post(url, { 
     headers: headers 
    }); 
    } 

Für eine kompliziertere und sicherere Möglichkeiten, können Sie überprüfen, wie Anti-Fälschungsmiddleware here und here zu implementieren.

+1

Ich habe ActionExecutingContext für die .net-Funktion verwendet (HttpActionContext hat nicht funktioniert. Ich verwende .net Core 2.0, wahrscheinlich deshalb.) Und im eckigen Dienst erhalte ich das "Passwort" vom lokalen Speicher . Ihre Lösung hat mir geholfen, danke! – Marian