Come implementare il server oauth2 in ASP.NET MVC 5 e WEB API 2 [chiuso]


127

Per prima cosa disegnerò il mio progetto:

Per il mio tirocinio ho bisogno di aggiungere funzionalità a un sistema esistente. Un client di terze parti deve essere in grado di accedere ai dati dai servizi Web di AX una volta che è stato autorizzato dall'utente tramite OAuth2. Comprendo che devo creare un "servizio web proxy" in cui il client può effettuare le sue chiamate e che chiama i servizi AX ma non sono sicuro della parte OAuth2. La maggior parte dei tutorial e delle guide riguarda l'uso dell'identità di ASP.NET per Facebook o Google-login. Non ne ho bisogno, devo usare le credenziali esistenti, quindi devo creare il mio servizio OAuth2.

Trovo difficile trovare tutorial, guide o spiegazioni su questo. Capisco OAuth2 e cosa deve essere fatto, ma non ho mai fatto una cosa del genere prima e trovo difficile iniziare. La cosa più vicina a ciò di cui ho bisogno è che ho trovato questo link repository github , ma la soluzione non si crea.

Quello che avevo in mente è creare un sito Web ASP.NET MVC in cui i clienti (terze parti) possono registrarsi e acquisire i loro ID cliente. Con l'API ASP.NET volevo creare l'API che accetta i token e i parametri richiesti e quindi accedere ai servizi Dyn AX.

È corretto o sbaglio del tutto? Qualsiasi aiuto o collegamento relativo alla creazione del proprio server / servizio oauth2 sarebbe utile.


Risposte:


189

Guarderò è, ma dai nomi dei capitoli penso che non sia di nuovo quello che cerco perché si concentra su Identity e i provider di identità di login di facebook / google.
Robin,

3
Solo la parte 4 riguarda Facebook e Google. Ho implementato il mio controller di autenticazione basato su questi tutorial due mesi fa. E stavo usando anche il mio database utente.
MichaelS,

1
Ho un'altra domanda, dove vengono archiviati questi token? Identity si occupa di tutto questo?
Robin,

17
@MichaelS grazie per aver fatto riferimento ai miei post sul blog, felice che sia stato utile per il tuo progetto :)
Taiseer Joudeh

@MichaelS Dubitavo che il modo in cui l'autenticazione basata su token fosse abbastanza sicura per il resto api. perché se riesco a ottenere il token dell'utente nel suo browser. Penso che possa essere raggiunto perché il token è archiviato nell'intestazione della richiesta Authentication. Posso fare tutto ciò che voglio come ottenere / pubblicare / mettere / cancellare.
Joe.wang,

87

Ho anche avuto difficoltà a trovare articoli su come generare semplicemente la parte token. Non ne ho mai trovato uno e ne ho scritto uno mio. Quindi se aiuta:

Le cose da fare sono:

  • Crea una nuova applicazione web
  • Installa i seguenti pacchetti NuGet:
    • Microsoft.Owin
    • Microsoft.Owin.Host.SystemWeb
    • Microsoft.Owin.Security.OAuth
    • Microsoft.AspNet.Identity.Owin
  • Aggiungi una startupclasse OWIN

Quindi creare un file HTML e JavaScript ( index.js) con questi contenuti:

var loginData = 'grant_type=password&username=test.test@mail.com&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>

La startupclasse OWIN dovrebbe avere questo contenuto:

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 == "test.test@mail.com" && context.Password == "test123")
                        {
                            ClaimsIdentity oAuthIdentity = new ClaimsIdentity(context.Options.AuthenticationType);
                            context.Validated(oAuthIdentity);
                        }
                    }
                },
                AllowInsecureHttp = true,
                AccessTokenExpireTimeSpan = TimeSpan.FromDays(1)
            };

            app.UseOAuthBearerTokens(OAuthOptions);
        }
    }
}

Esegui il tuo progetto. Il token dovrebbe essere visualizzato nel pop-up.


5
Mi piace molto come non hai introdotto ASP Identity o Entity Framework. La maggior parte degli articoli che ho visto li integra con la soluzione OAuth. La tua soluzione si concentra su OAuth e sull'emissione del token. Molto bella. Grazie anche per la pubblicazione sul tuo blog.
webworm,

@Kai - Dove Microsoft ASP.NET Identity Owinentra in gioco? Stai usando ASP.NET Identity per l'autenticazione utente? In caso contrario, questo pacchetto NuGet è ancora necessario?
webworm,

1
@webworm - La linea app.UseOAuthBearerTokens(OAuthOptions);non funzionerà senza Microsoft ASP.NET Identity Owin. Non riconosce il metodo UseOAuthBearerTokens.
Kai Hartmann,

pacchetto mancante: Microsoft.Owin.Host.SystemWeb, Microsoft ASP.NET Identity Owin
Muhammed Afsal

3
Voglio solo aggiungere una cosa, ad esempio se anche tu stai ottenendo un errore di assemblaggio non valido per Newtonsoft.Json (in .NET 4.6 e versioni successive), aggiorna Newtonsoft.Json alla versione 11 o successiva.
vibs2006,


-12

Gmail: OAuth

  • Vai al link
  • Accedi con la password del tuo nome utente gmail
  • Fai clic sul menu di Google in alto a sinistra
  • Fai clic su Gestione API
  • Fai clic su Credenziali
  • Fai clic su Crea credenziali e seleziona OAuth Client
  • Seleziona Applicazione Web come Tipo di applicazione e inserisci il nome-> Inserisci URL di reindirizzamento autorizzato (ad es. Http: // localhost: 53922 / signin-google ) -> Fai clic sul pulsante Crea. Questo creerà le credenziali. Si prega di prendere nota di Client IDe Secret ID. Infine, fai clic su OK per chiudere le credenziali.
  • Il prossimo passo importante è abilitare il Google API. Fai clic su Panoramica nel riquadro a sinistra.
  • Fai clic sulla Google APIsezione API social.
  • Fai clic su Abilita.

Questo è tutto dalla parte di Google.

Torna alla tua applicazione, apri App_start/Startup.Auth.cse decommenta il seguente frammento

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

Aggiorna ClientIde ClientSecretcon i valori dalle Google APIcredenziali che hai già creato.

  • Esegui la tua applicazione
  • Fai clic su Accedi
  • Vedrai il pulsante Google nella sezione "Utilizza un'altra sezione per accedere"
  • Fai clic sul pulsante Google
  • L'applicazione ti chiederà di inserire nome utente e password
  • Inserisci il nome utente e la password di Gmail e fai clic su Accedi
  • Questo eseguirà OAuth e tornerà alla tua applicazione e ti chiederà di registrarti con l' Gmailid.
  • Fare clic su Register per registrare l' Gmailid nel database dell'applicazione.
  • Vedrai i dettagli dell'identità visualizzati in alto come normali registrazioni
  • Prova a disconnetterti e accedi nuovamente tramite Gmail. Questo ti farà accedere automaticamente all'app.

15
L'utente afferma esplicitamente di non voler utilizzare gli accessi a Facebook o Gmail.
Bartho Bernsmann,

Non penso sia necessario sottovalutare questa risposta. È sufficiente un voto sul commento in alto. Questa risposta contiene informazioni utili e il rispondente ha speso un vero sforzo creativo per fornire tali informazioni. Why punish that effort? Forse SO ha bisogno di un modo per contrassegnare una risposta come disallineata alla domanda dei PO. O per consentire agli utenti di suggerire che venga spostato in una domanda più appropriata ... o di creare una nuova domanda dalla risposta.
Walter Stabosz,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.