c# - segura - Autenticación de token de API web con una base de datos de usuario personalizada
token de autenticación (5)
Estoy desarrollando un servicio Web API 2.1 que necesita autenticar a los clientes que se conectan (clientes HTML5 / JS que crearé y controlaré). Lamentablemente, la información del usuario (nombre de usuario, contraseñas de contraseña, roles y mucha, mucha más información) se almacena en una base de datos existente (SQL Server) a la que solo tengo acceso de lectura. La tabla de la base de datos de usuarios se creó hace 5-6 años sin ninguna referencia a los marcos de seguridad, por lo que es un formato completamente personalizado. No puedo hacer ningún cambio ni en los datos ni en la estructura de la base de datos.
Inspirado por este artículo , lancé mi propio método basado en token para autenticar usuarios, pero me falta la integridad y la (re) seguridad de usar un marco de seguridad establecido.
¿Hay alguna manera de integrar un marco existente, por ejemplo, OAuth2, dentro de mi proyecto actual dadas las limitaciones que mencioné anteriormente? No sé si hace alguna diferencia, pero me autoalojo usando OWIN.
EDITAR: No sé por qué un par de personas menospreciaron esta pregunta: ¿es realmente tan malo? Es una pregunta genuina en lo que a mí respecta, y me encantaría tener una respuesta (incluso si es " no, no puedes hacer eso porque ... "). Si esas personas pueden explicar sus razones en un comentario, eso sería apreciado.
Alguien más, que tenga la competencia, puede explicar las opciones. Pero si la autenticación como servicio es una opción, entonces consulte Auth0 @ https://auth0.com
Probé el servicio (como complemento de Azure) usando aplicaciones HTML / JS y nativas de Windows Phone, en una tabla Sql Server simple y AD. Funciona con encanto, casi sin dolor de cabeza.
Esta es una buena respuesta a una pregunta similar. Básicamente dice:
- Crear una clase de usuario personalizada que implemente
IUser
- Defina una tienda de usuario personalizada que implemente
public class UserStoreService : IUserStore<CustomUser>, IUserPasswordStore<CustomUser>
- conectar todo
Como la respuesta es bastante extensa, solo proporcioné los pasos básicos ... los detalles están aquí: ¿cómo personalizar la autenticación a mi propio conjunto de tablas en asp.net web api 2?
Este es también un contenido muy valioso que también se aplica a la API web:
Personalizar la Autenticación ASP.NET con Identidad por JumpStart
https://channel9.msdn.com/Series/Customizing-ASPNET-Authentication-with-Identity
HTH
Esto podría ser un enfoque totalmente loco e inválido para ti, pero me enfrenté a un desafío similar: Nueva aplicación web (MVVM + WebAPI), sistema heredado utilizado para emitir y validar tokens. Inspirado en http://tech.pro/tutorial/1216/implementing-custom-authentication-for-aspnet , y dado que mi aplicación sería utilizada principalmente por su GUI (la aplicación web MVVM), decidí usar una "cookie based "token producido por FormsAuthentication. La cookie / ticket de FormsAutnentication está asegurada por la seguridad mágica interna de .NET (que asumo id completamente seguro e irrompible).
En mi caso, la cookie simplemente contiene el boleto emitido por el sistema heredado, (pero también podría almacenar más detalles allí, por ejemplo, mediante JSONSerialización de un tipo personalizado). Durante la autorización, mi sistema valida el token contra el sistema heredado. Supongo que podrías usar algo similar junto con un AuthorizationFilter personalizado.
Me encontré con mi solución al intentar implementar la autenticación json token dentro de la API web. Es importante tener en cuenta que mi solución maneja la autenticación al enviar un token json a través del encabezado Autenticación de la solicitud Http ( no a través de cookies ) y no al usar Microsoft.Identity framework.
De todos modos, básicamente implementé en forma de libro de cocina la solución que aquí se describe de manera útil por Taiseer Joudeh: http://bitoftech.net/2014/10/27/json-web-token-asp-net-web-api-2-jwt-owin-authorization-server/
La clave a tener en cuenta es el siguiente fragmento de código:
//Dummy check here, you need to do your DB checks against memebrship system http://bit.ly/SPAAuthCode
if (context.UserName != context.Password)
{
context.SetError("invalid_grant", "The user name or password is incorrect");
//return;
return Task.FromResult<object>(null);
}
Naturalmente, reemplazaría este código con su propio método para verificar su base de datos de usuarios (presumiblemente preexistente). Una vez que implementé esto, me di cuenta de que no es necesario usar el primer marco de identidad de código nuevo que Visual Studio instala para usted.
Para hacer esto, hice lo siguiente:
1) Creó un proyecto vacío y seleccionó Cambiar autenticación / Cuentas de usuario individuales . Esto instala la mayoría de las referencias requeridas y los archivos que necesita de manera predeterminada para usar la autenticación de tokens mediante cookies, así como los archivos de marcos de identidad de primer código.
2) Editó estos archivos siguiendo el ejemplo de Taiseer Joudeh. Esto requiere algunos objetos nuevos como CustomOAuthProvider.cs entre otros. Y debe implementar su propia comprobación de usuario / contraseña personalizando este bloque de código:
if (context.UserName != context.Password) { context.SetError("invalid_grant", "The user name or password is incorrect"); //return; return Task.FromResult<object>(null); }
Enlace a las instrucciones de Taiseer Joudeh: http://bitoftech.net/2014/10/27/json-web-token-asp-net-web-api-2-jwt-owin-authorization-server/
3) Limpié mi proyecto de archivos extraños (AccountBindingModels.cs, AccountViewModels.cs, IdentityModels.cs, ApplicationOAuthProvider.cs, identityConfig.cs, AccountBindingModels.cs, AccountViewModels.cs). Básicamente, no más referencias de identidad de Microsoft.
Estoy seguro de que microsoft.identity es excelente, pero estaba molesto con la implementación de bases de datos con código cuando ya estaba usando algunas bases de datos heredadas de una estructura diferente, etc. Espero que esto ayude. Estoy bastante satisfecho con el resultado (después de unos días de perder el tiempo para que funcione).
No quería usar ninguna clase existente y finalmente salir algo muy simple como
var userName = context.UserName;
var password = context.Password;
var userService = new UserService(); // our created one
var user = userService.ValidateUser(userName, password);
if (user != null){
.......
}
Consulte todos los detalles aquí Autenticación de base de tokens de OAuth Web API con base de datos personalizada
Espero que ayude a alguien