Cómo implementar el servidor oauth2 en ASP.NET MVC 5 y WEB API 2 [cerrado]

127

Primero esbozaré mi proyecto:

Para mi pasantía, necesito agregar funcionalidad a un sistema existente. Un cliente de terceros debe poder acceder a los datos de los servicios web de AX una vez que el usuario lo autorice a través de OAuth2. Entiendo que necesito hacer un 'servicio web proxy' para que el cliente pueda hacer sus llamadas y que llame a los servicios de AX, pero estoy un poco inseguro sobre la parte OAuth2. La mayoría de los tutoriales y guías tratan sobre el uso de Identidad de ASP.NET para los inicios de sesión de Facebook o Google. No necesito eso, necesito usar las credenciales existentes, así que necesito crear mi propio servicio OAuth2.

Me resulta difícil encontrar tutoriales, guías o explicaciones sobre esto. Entiendo OAuth2 y lo que hay que hacer, pero nunca antes había hecho algo así y me resulta difícil comenzar. Lo más parecido a lo que necesito que encontré es este enlace de repositorio de github , pero la solución no se construye.

Lo que tenía en mente es crear un sitio web ASP.NET MVC donde los clientes (terceros) pueden registrarse y adquirir sus ID de cliente. Con ASP.NET API, quería crear la API que tomara los tokens y parámetros necesarios, y luego acceder a los servicios Dyn AX.

¿Es esto correcto o estoy completamente equivocado? Cualquier ayuda o enlaces relacionados con la construcción de su propio servidor / servicio oauth2 sería bueno.

Robin
fuente

Respuestas:

189

Hay una brillante publicación de blog de Taiseer Joudeh con una descripción detallada paso a paso.

  1. Parte 1: Autenticación basada en tokens utilizando ASP.NET Web API 2, Owin e Identity
  2. Parte 2: Autenticación de token AngularJS utilizando ASP.NET Web API 2, Owin e Identity
  3. Parte 3: Habilite los tokens de actualización de OAuth en la aplicación AngularJS utilizando ASP .NET Web API 2 y Owin
  4. Parte 4: inicios de sesión externos de ASP.NET Web API 2 con Facebook y Google en la aplicación AngularJS
  5. Parte 5: desacoplar el servidor de autorización OWIN del servidor de recursos
MichaelS
fuente
Lo veré pero, por los nombres de los capítulos, creo que nuevamente no es lo que busco, ya que se enfoca en los proveedores de Identidad y Facebook / Google.
Robin
3
Solo la parte 4 es sobre Facebook y Google. Implementé mi propio controlador de autenticación basado en estos tutoriales hace dos meses. Y también estaba usando mi propia base de datos de usuario.
MichaelS
1
Tengo una pregunta más, ¿dónde se almacenan estos tokens? ¿Identity se encarga de esto por completo?
Robin
17
@MichaelS gracias por consultar mis publicaciones en el blog, me alegra que haya sido útil para su proyecto :)
Taiseer Joudeh
@MichaelS Dudé si la forma de autenticación basada en tokens es suficiente seguridad para el resto de la API. porque si puedo obtener el token del usuario en su navegador. Creo que se puede lograr porque el token se almacena en el encabezado de la solicitud Authentication. Puedo hacer todo lo que quiero como get / post / put / delete.
Joe.wang
87

También me costó encontrar artículos sobre cómo generar la parte del token. Nunca encontré uno y escribí el mío. Entonces, si ayuda:

Las cosas que hacer son:

  • Crear una nueva aplicación web
  • Instale los siguientes paquetes NuGet:
    • Microsoft.Owin
    • Microsoft.Owin.Host.SystemWeb
    • Microsoft.Owin.Security.OAuth
    • Microsoft.AspNet.Identity.Owin
  • Agregar una startupclase OWIN

Luego cree un index.jsarchivo HTML y un archivo JavaScript ( ) con estos contenidos:

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 startupclase OWIN debe tener este contenido:

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

Ejecute su proyecto. El token debe mostrarse en la ventana emergente.

Kai Hartmann
fuente
55
Realmente me gusta cómo no trajiste ASP Identity o Entity Framework. La mayoría de los artículos que he visto los integran con la solución OAuth. Su solución se centra en OAuth y la emisión del token. Muy agradable. Gracias también por publicar en tu blog.
gusano web
@Kai - ¿Dónde Microsoft ASP.NET Identity Owinentra en juego? ¿Está utilizando Identidad ASP.NET para su autenticación de usuario? Si no, ¿todavía se necesita este paquete NuGet?
gusano web
1
@webworm: la línea app.UseOAuthBearerTokens(OAuthOptions);no funcionará sin ella Microsoft ASP.NET Identity Owin. No reconoce el método UseOAuthBearerTokens.
Kai Hartmann
paquete perdido: Microsoft.Owin.Host.SystemWeb, Microsoft ASP.NET Identity Owin
Muhammed Afsal
3
Solo quiero agregar una cosa, es decir, si usted también obtiene un error de ensamblaje no válido de Newtonsoft.Json (en .NET 4.6 y superior), actualice Newtonsoft.Json a la versión 11 o superior.
vibs2006
-12

Gmail: OAuth

  • Ir al enlace
  • Inicie sesión con su contraseña de nombre de usuario de gmail
  • Haz clic en el menú de Google en la esquina superior izquierda.
  • Haga clic en Administrador de API
  • Haga clic en credenciales
  • Haga clic en Crear credenciales y seleccione Cliente OAuth
  • Seleccione Aplicación web como Tipo de aplicación e ingrese el Nombre-> Ingresar URL de redireccionamiento autorizado (por ejemplo: http: // localhost: 53922 / signin-google ) -> Haga clic en el botón Crear. Esto creará las credenciales. Por favor tome nota de Client IDy Secret ID. Finalmente, haga clic en Aceptar para cerrar la ventana emergente de credenciales.
  • El siguiente paso importante es habilitar el Google API. Haga clic en Descripción general en el panel izquierdo.
  • Haga clic en la Google APIsección de API de redes sociales.
  • Haz clic en Habilitar.

Eso es todo por parte de Google.

Regrese a su aplicación, abra App_start/Startup.Auth.csy descomente el siguiente fragmento

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

Actualice ClientIdy ClientSecretcon los valores de las Google APIcredenciales que ya ha creado.

  • Ejecute su aplicación
  • Haga clic en Iniciar sesión
  • Verá el botón Google en la sección 'Usar otra sección para iniciar sesión'
  • Haga clic en el botón de Google
  • La aplicación le pedirá que ingrese el nombre de usuario y la contraseña
  • Ingrese el nombre de usuario y contraseña de gmail y haga clic en Iniciar sesión
  • Esto realizará el OAuth y volverá a su aplicación y le pedirá que se registre con la Gmailidentificación.
  • Haga clic en registrarse para registrar la Gmailidentificación en la base de datos de su aplicación.
  • Verá que los detalles de identidad aparecen en la parte superior como registro normal
  • Intente cerrar sesión e inicie sesión nuevamente a través de Gmail. Esto iniciará sesión automáticamente en la aplicación.
Ramachandran
fuente
15
El usuario declara explícitamente que no quiere usar los inicios de sesión de Facebook o Gmail.
Bartho Bernsmann
No creo que sea necesario rechazar esta respuesta. Un voto positivo en el comentario superior es suficiente. Esta respuesta contiene información útil, y el respondedor realizó un esfuerzo creativo real para proporcionar dicha información. Why punish that effort? Quizás SO necesita una forma de marcar una respuesta como desalineada a la pregunta de los OP. O para permitir que los usuarios sugieran que se mueva a una pregunta más apropiada ... o para crear una nueva pregunta a partir de la respuesta.
Walter Stabosz