So implementieren Sie den oauth2-Server in ASP.NET MVC 5 und WEB API 2 [geschlossen]

127

Zuerst skizziere ich mein Projekt:

Für mein Praktikum muss ich einem bestehenden System Funktionen hinzufügen. Ein Drittanbieter muss in der Lage sein, auf Daten von AX Webservices zuzugreifen, sobald er vom Benutzer über OAuth2 autorisiert wurde. Ich verstehe, dass ich einen 'Proxy-Webdienst' erstellen muss, über den der Client seine Anrufe tätigen kann, und der die AX-Dienste aufruft, bin mir jedoch hinsichtlich des OAuth2-Teils etwas unsicher. In den meisten Tutorials und Anleitungen geht es um die Verwendung von ASP.NETs Identity for Facebook oder Google-Logins. Ich brauche das nicht, ich muss vorhandene Anmeldeinformationen verwenden, damit ich meinen eigenen OAuth2-Dienst erstellen kann.

Es fällt mir schwer, Tutorials, Anleitungen oder Erklärungen dazu zu finden. Ich verstehe OAuth2 und was getan werden muss, aber ich habe so etwas noch nie zuvor getan und finde es schwierig, damit anzufangen. Das, was ich gefunden habe, ist dieser Github-Repo-Link am nächsten , aber die Lösung wird nicht erstellt.

Ich hatte vor, eine ASP.NET MVC-Website zu erstellen, auf der sich Kunden (Dritte) registrieren und ihre Kunden-IDs erwerben können. Mit der ASP.NET-API wollte ich die API erstellen, die die erforderlichen Token und Parameter verwendet, und dann auf die Dyn AX-Dienste zugreifen.

Ist das richtig oder bin ich völlig falsch? Jede Hilfe oder Links zum Aufbau eines eigenen oauth2-Servers / -Dienstes wäre nett.

Robin
quelle

Antworten:

189

Es gibt einen brillanten Blog-Beitrag von Taiseer Joudeh mit einer detaillierten schrittweisen Beschreibung.

  1. Teil 1: Token-basierte Authentifizierung mit ASP.NET Web API 2, Owin und Identity
  2. Teil 2: AngularJS-Token-Authentifizierung mit ASP.NET Web API 2, Owin und Identity
  3. Teil 3: Aktivieren von OAuth-Aktualisierungstoken in der AngularJS-App mithilfe von ASP .NET Web API 2 und Owin
  4. Teil 4: Externe Anmeldungen der ASP.NET Web API 2 mit Facebook und Google in der AngularJS-App
  5. Teil 5: Entkoppeln des OWIN-Autorisierungsservers vom Ressourcenserver
MichaelS
quelle
Ich werde es mir ansehen, aber aus den Kapitelnamen denke ich, dass es wieder nicht das ist, wonach ich suche, da es sich auf Identitäts- und Facebook / Google Login-Identitätsanbieter konzentriert.
Robin
3
Nur in Teil 4 geht es um Facebook und Google. Ich habe vor zwei Monaten meinen eigenen Authentifizierungscontroller basierend auf diesen Tutorials implementiert. Und ich habe auch meine eigene Benutzerdatenbank verwendet.
MichaelS
1
Ich habe noch eine Frage, wo werden diese Token gespeichert? Kümmert sich Identity vollständig darum?
Robin
17
@ MichaelS danke für den Verweis auf meine Blog-Beiträge, froh, dass es für Ihr Projekt hilfreich war :)
Taiseer Joudeh
@MichaelS Ich bezweifelte, dass die Art der Token-basierten Authentifizierung für den Rest der API sicher genug ist. denn wenn ich das Token des Benutzers in seinem Browser bekommen kann. Ich denke, dass dies erreicht werden kann, weil das Token im Anforderungsheader gespeichert ist Authentication. Ich kann alles tun, was ich will, wie get / post / put / delete.
Joe.wang
87

Ich hatte auch Probleme, Artikel darüber zu finden, wie man nur den Token-Teil generiert. Ich habe nie einen gefunden und meinen eigenen geschrieben. Also wenn es hilft:

Die Dinge zu tun sind:

  • Erstellen Sie eine neue Webanwendung
  • Installieren Sie die folgenden NuGet-Pakete:
    • Microsoft.Owin
    • Microsoft.Owin.Host.SystemWeb
    • Microsoft.Owin.Security.OAuth
    • Microsoft.AspNet.Identity.Owin
  • Fügen Sie eine OWIN- startupKlasse hinzu

Erstellen Sie dann eine HTML- und eine JavaScript ( index.js) -Datei mit folgenden Inhalten:

var loginData = 'grant_type=password&[email protected]&password=test123';

var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function () {
    if (xmlhttp.readyState === 4 && xmlhttp.status === 200) {
        alert(xmlhttp.responseText);
    }
}
xmlhttp.open("POST", "/token", true);
xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xmlhttp.send(loginData);
<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>
    <script type="text/javascript" src="index.js"></script>
</body>
</html>

Die OWIN- startupKlasse sollte folgenden Inhalt haben:

using System;
using System.Security.Claims;
using Microsoft.Owin;
using Microsoft.Owin.Security.OAuth;
using OAuth20;
using Owin;

[assembly: OwinStartup(typeof(Startup))]

namespace OAuth20
{
    public class Startup
    {
        public static OAuthAuthorizationServerOptions OAuthOptions { get; private set; }

        public void Configuration(IAppBuilder app)
        {
            OAuthOptions = new OAuthAuthorizationServerOptions()
            {
                TokenEndpointPath = new PathString("/token"),
                Provider = new OAuthAuthorizationServerProvider()
                {
                    OnValidateClientAuthentication = async (context) =>
                    {
                        context.Validated();
                    },
                    OnGrantResourceOwnerCredentials = async (context) =>
                    {
                        if (context.UserName == "[email protected]" && context.Password == "test123")
                        {
                            ClaimsIdentity oAuthIdentity = new ClaimsIdentity(context.Options.AuthenticationType);
                            context.Validated(oAuthIdentity);
                        }
                    }
                },
                AllowInsecureHttp = true,
                AccessTokenExpireTimeSpan = TimeSpan.FromDays(1)
            };

            app.UseOAuthBearerTokens(OAuthOptions);
        }
    }
}

Führen Sie Ihr Projekt aus. Das Token sollte im Popup angezeigt werden.

Kai Hartmann
quelle
5
Mir gefällt sehr gut, dass Sie ASP Identity oder Entity Framework nicht eingeführt haben. Die meisten Artikel, die ich gesehen habe, integrieren diese in die OAuth-Lösung. Ihre Lösung konzentriert sich auf OAuth und die Ausgabe des Tokens. Sehr schön. Vielen Dank auch für die Veröffentlichung in Ihrem Blog.
Webworm
@Kai - Wo kommt Microsoft ASP.NET Identity Owindas ins Spiel? Verwenden Sie ASP.NET Identity für Ihre Benutzerauthentifizierung? Wenn nicht, wird dieses NuGet-Paket noch benötigt?
Webworm
1
@wewworm - Die Leitung wird app.UseOAuthBearerTokens(OAuthOptions);ohne nicht funktionieren Microsoft ASP.NET Identity Owin. Die Methode wird nicht erkannt UseOAuthBearerTokens.
Kai Hartmann
fehlendes Paket: Microsoft.Owin.Host.SystemWeb, Microsoft ASP.NET-Identität Owin
Muhammed Afsal
2
Ich möchte nur eines hinzufügen: Wenn auch Sie einen ungültigen Assemblyfehler von Newtonsoft.Json erhalten (in .NET 4.6 und höher), aktualisieren Sie Newtonsoft.Json auf Version 11 oder höher.
Vibs2006
-12

Google Mail: OAuth

  • Gehe zum Link
  • Melden Sie sich mit Ihrem Google Mail-Benutzernamen an
  • Klicken Sie oben links auf das Google-Menü
  • Klicken Sie auf API Manager
  • Klicken Sie auf Anmeldeinformationen
  • Klicken Sie auf Anmeldeinformationen erstellen und wählen Sie OAuth Client aus
  • Wählen Sie Webanwendung als Anwendungstyp und geben Sie den Namen-> Autorisierte Weiterleitungs-URL eingeben (z. B. http: // localhost: 53922 / signin-google ) -> Klicken Sie auf die Schaltfläche Erstellen. Dadurch werden die Anmeldeinformationen erstellt. Bitte notieren Sie sich Client IDund Secret ID. Klicken Sie abschließend auf OK, um das Popup-Fenster mit den Anmeldeinformationen zu schließen.
  • Der nächste wichtige Schritt ist die Aktivierung des Google API. Klicken Sie im linken Bereich auf Übersicht.
  • Klicken Sie auf den Google APIAbschnitt unter Soziale APIs.
  • Klicken Sie auf Aktivieren.

Das ist alles aus dem Google-Teil.

Kehren Sie zu Ihrer Anwendung zurück, öffnen Sie App_start/Startup.Auth.csdas folgende Snippet und kommentieren Sie es aus

        app.UseGoogleAuthentication(new GoogleOAuth2AuthenticationOptions()
        {
            ClientId = "",
            ClientSecret = ""
        });

Aktualisieren Sie das ClientIdund ClientSecretmit den Werten aus Google APIAnmeldeinformationen, die Sie bereits erstellt haben.

  • Führen Sie Ihre Anwendung aus
  • Klicken Sie auf Anmelden
  • Sie sehen die Google-Schaltfläche unter "Anmelden in einem anderen Bereich"
  • Klicken Sie auf die Google-Schaltfläche
  • Die Anwendung fordert Sie auf, den Benutzernamen und das Passwort einzugeben
  • Geben Sie den Google Mail-Nutzernamen und das Passwort ein und klicken Sie auf Anmelden
  • Dadurch wird die OAuth ausgeführt und Sie kehren zu Ihrer Anwendung zurück und werden aufgefordert, sich mit der GmailID zu registrieren .
  • Klicken Sie auf Registrieren, um die GmailID in Ihrer Anwendungsdatenbank zu registrieren .
  • Sie sehen die Identitätsdetails oben als normale Registrierung
  • Versuchen Sie, sich abzumelden und erneut über Google Mail anzumelden. Dadurch werden Sie automatisch bei der App angemeldet.
Ramachandran
quelle
15
Der Benutzer gibt ausdrücklich an, dass er keine Facebook- oder Google Mail-Anmeldungen verwenden möchte.
Bartho Bernsmann
Ich denke nicht, dass es notwendig ist, diese Antwort abzulehnen. Eine positive Bewertung des Top-Kommentars ist ausreichend. Diese Antwort enthält nützliche Informationen, und der Antwortende hat echte kreative Anstrengungen unternommen, um diese Informationen bereitzustellen. Why punish that effort? Vielleicht braucht SO eine Möglichkeit, eine Antwort als falsch auf die Frage des OP ausgerichtet zu kennzeichnen. Oder um Benutzern zu ermöglichen, vorzuschlagen, dass sie zu einer angemesseneren Frage verschoben werden ... oder um aus der Antwort eine neue Frage zu erstellen.
Walter Stabosz