Comment implémenter le serveur oauth2 dans ASP.NET MVC 5 et WEB API 2 [fermé]

127

Je vais d'abord esquisser mon projet:

Pour mon stage, j'ai besoin d'ajouter des fonctionnalités à un système existant. Un client tiers doit pouvoir accéder aux données des services Web AX une fois qu'il est autorisé par l'utilisateur via OAuth2. Je comprends que j'ai besoin de créer un «service Web proxy» pour que le client puisse passer ses appels et qui appelle les services AX, mais je ne suis pas sûr de la partie OAuth2. La plupart des didacticiels et guides concernent l'utilisation de l'identité ASP.NET pour Facebook ou Google-logins. Je n'ai pas besoin de cela, je dois utiliser les informations d'identification existantes, je dois donc créer mon propre service OAuth2.

J'ai du mal à trouver des tutoriels, des guides ou des explications à ce sujet. Je comprends OAuth2 et ce qui doit être fait, mais je n'ai jamais fait une telle chose auparavant et j'ai du mal à démarrer. Ce que j'ai trouvé le plus proche de ce dont j'ai besoin est ce lien de dépôt github , mais la solution ne se construit pas.

Ce que j'avais à l'esprit, c'est de créer un site Web ASP.NET MVC où les clients (tiers) peuvent s'enregistrer et acquérir leur ID client. Avec l'API ASP.NET, je voulais créer l'API qui prend les jetons et les paramètres requis, puis accéder aux services Dyn AX.

Est-ce correct ou ai-je totalement tort? Toute aide ou lien concernant la création de votre propre serveur / service oauth2 serait bien.

Robin
la source

Réponses:

189

Il y a un article de blog brillant de Taiseer Joudeh avec une description détaillée étape par étape.

  1. Partie 1: Authentification basée sur les jetons à l'aide de l'API Web ASP.NET 2, Owin et Identity
  2. Partie 2: Authentification par jeton AngularJS à l'aide de l'API Web ASP.NET 2, Owin et Identity
  3. Partie 3: Activer les jetons d'actualisation OAuth dans l'application AngularJS à l'aide de l'API Web ASP .NET 2 et Owin
  4. Partie 4: Connexions externes de l'API Web ASP.NET 2 avec Facebook et Google dans l'application AngularJS
  5. Partie 5: Découpler le serveur d'autorisation OWIN du serveur de ressources
MichaelS
la source
Je vais regarder, mais à partir des noms de chapitre, je pense que ce n'est pas non plus ce que je recherche car il se concentre sur les fournisseurs d'identité et de connexion Facebook / Google.
Robin
3
Seule la partie 4 concerne Facebook et Google. J'ai implémenté mon propre contrôleur d'authentification basé sur ces tutoriels il y a deux mois. Et j'utilisais aussi ma propre base de données d'utilisateurs.
MichaelS
1
J'ai une autre question, où ces jetons sont-ils stockés? L'identité s'en charge-t-elle entièrement?
Robin
17
@MichaelS merci d'avoir fait référence à mes articles de blog, heureux que cela ait été utile pour votre projet :)
Taiseer Joudeh
@MichaelS Je doutais que la méthode d'authentification basée sur les jetons soit suffisamment sécurisée pour le reste de l'API. parce que si je peux avoir le jeton de l'utilisateur dans son navigateur. Je pense que cela peut être réalisé car le jeton est stocké dans l'en-tête de la demande Authentication. Je peux faire tout ce que je veux, comme get / post / put / delete.
Joe.wang
87

J'ai également eu du mal à trouver des articles sur la façon de générer simplement la partie jeton. Je n'en ai jamais trouvé et j'ai écrit le mien. Donc, si cela aide:

Les choses à faire sont:

  • Créer une nouvelle application Web
  • Installez les packages NuGet suivants:
    • Microsoft.Owin
    • Microsoft.Owin.Host.SystemWeb
    • Microsoft.Owin.Security.OAuth
    • Microsoft.AspNet.Identity.Owin
  • Ajouter une startupclasse OWIN

Créez ensuite un index.jsfichier HTML et un fichier JavaScript ( ) avec ces contenus:

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>

La startupclasse OWIN doit avoir ce contenu:

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);
        }
    }
}

Exécutez votre projet. Le jeton doit être affiché dans la fenêtre contextuelle.

Kai Hartmann
la source
5
J'aime vraiment le fait que vous n'ayez pas introduit ASP Identity ou Entity Framework. La plupart des articles que j'ai vus les intègrent à la solution OAuth. Votre solution se concentre sur OAuth et l'émission du jeton. Très agréable. Merci également d'avoir publié sur votre blog.
webworm
@Kai - D'où Microsoft ASP.NET Identity Owinvient-il en jeu? Utilisez-vous ASP.NET Identity pour votre authentification utilisateur? Sinon, ce package NuGet est-il toujours nécessaire?
webworm
1
@webworm - La ligne app.UseOAuthBearerTokens(OAuthOptions);ne fonctionnera pas sans Microsoft ASP.NET Identity Owin. Il ne reconnaît pas la méthode UseOAuthBearerTokens.
Kai Hartmann le
package manquant: Microsoft.Owin.Host.SystemWeb, Microsoft ASP.NET Identity Owin
Muhammed Afsal
3
Je veux juste ajouter une chose, c'est-à-dire que si vous obtenez également une erreur d'assemblage non valide Newtonsoft.Json (dans .NET 4.6 et supérieur), veuillez mettre à jour Newtonsoft.Json vers la version 11 ou supérieure.
vibs2006
-12

Gmail: OAuth

  • Aller au lien
  • Connectez-vous avec votre mot de passe de nom d'utilisateur gmail
  • Cliquez sur le menu google en haut à gauche
  • Cliquez sur API Manager
  • Cliquez sur Identifiants
  • Cliquez sur Créer des informations d'identification et sélectionnez Client OAuth
  • Sélectionnez Application Web comme type d'application et entrez le nom-> Entrez l'URL de redirection autorisée (par exemple: http: // localhost: 53922 / signin-google ) -> Cliquez sur le bouton Créer. Cela créera les informations d'identification. Veuillez noter Client IDet Secret ID. Enfin, cliquez sur OK pour fermer la fenêtre des informations d'identification.
  • La prochaine étape importante consiste à activer le Google API. Cliquez sur Aperçu dans le volet gauche.
  • Cliquez sur la Google APIsection sous Social APIs.
  • Cliquez sur Activer.

C'est tout de la partie Google.

Revenez à votre application, ouvrez App_start/Startup.Auth.cset supprimez les commentaires de l'extrait suivant

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

Mettez à jour ClientIdet ClientSecretavec les valeurs des Google APIinformations d' identification que vous avez déjà créées.

  • Exécutez votre application
  • Cliquez sur Connexion
  • Vous verrez le bouton Google dans la section "Utiliser une autre section pour vous connecter".
  • Cliquez sur le bouton Google
  • L'application vous demandera d'entrer le nom d'utilisateur et le mot de passe
  • Entrez le nom d'utilisateur et le mot de passe Gmail et cliquez sur Se connecter
  • Cela effectuera l'OAuth et reviendra à votre application et vous invitera à vous inscrire avec l' Gmailid.
  • Cliquez sur enregistrer pour enregistrer l' GmailID dans votre base de données d'application.
  • Vous verrez les détails d'identité apparaître en haut comme enregistrement normal
  • Essayez de vous déconnecter et de vous reconnecter via Gmail. Cela vous connectera automatiquement à l'application.
Ramachandran
la source
15
L'utilisateur déclare explicitement qu'il ne souhaite pas utiliser les identifiants Facebook ou Gmail.
Bartho Bernsmann
Je ne pense pas qu'il soit nécessaire de voter contre cette réponse. Un vote positif sur le commentaire supérieur est suffisant. Cette réponse contient des informations utiles, et le répondant a déployé un réel effort créatif pour fournir ces informations. Why punish that effort? Le SO a peut-être besoin d'un moyen de marquer une réponse comme étant mal associée à la question du PO. Ou pour permettre aux utilisateurs de suggérer qu'elle soit déplacée vers une question plus appropriée ... ou de créer une nouvelle question à partir de la réponse.
Walter Stabosz