web-dev-qa-db-fra.com

Comment implémenter un serveur oauth2 dans ASP.NET MVC 5 et WEB API 2

Je vais d'abord dessiner 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 d'AX Webservices une fois qu'il est autorisé par l'utilisateur via OAuth2. Je comprends que je dois créer un "service Web proxy" auquel le client peut faire ses appels et qui appelle les services AX, mais je ne suis pas très sûr de la partie OAuth2. La plupart des tutoriels et des guides traitent de l’utilisation de Identity for Facebook ou des connexions Google pour ASP.NET. Je n'ai pas besoin de cela, je dois utiliser les informations d'identification existantes, donc je dois 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. La chose la plus proche de ce dont j'ai besoin que j'ai trouvée est ceci lien de repo github , mais la solution ne se construit pas.

Je pensais créer un site Web ASP.NET MVC sur lequel les clients (tiers) pourraient s’inscrire 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 entièrement tort? Toute aide ou lien concernant la construction de votre propre serveur/service oauth2 serait agréable.

120
Robin
184
MichaelS

J'ai également eu du mal à trouver des articles sur la manière de générer simplement la partie jeton. Je n'en ai jamais trouvé et j'ai écrit le mien. Donc si ça 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 classe OWIN startup

Créez ensuite un fichier HTML et un fichier JavaScript (index.js) avec le contenu suivant:

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 classe OWIN startup devrait 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.

81
Kai Hartmann

Je recherche la même chose et suis tombé sur identityserver qui implémente OAuth et OpenID sur ASP.NET. Il s'intègre avec identité ASP.NET et redémarrage de l'adhésion avec prise en charge de la persistance pour Entity Framework.

Donc, pour répondre à votre question, consultez leur document détaillé sur comment configurer un serveur OAuth et OpenID .

4
Korayem