c# - Cómo asegurar una API web ASP.NET



3 Answers

Yo sugeriría comenzar con las soluciones más directas primero, tal vez una autenticación HTTP básica + HTTPS es suficiente en su escenario.

Si no es así (por ejemplo, no puede usar https o necesita una administración de claves más compleja), puede echar un vistazo a las soluciones basadas en HMAC como lo sugieren otros. Un buen ejemplo de dicha API sería Amazon S3 ( http://s3.amazonaws.com/doc/s3-developer-guide/RESTAuthentication.html )

Escribí una publicación de blog sobre autenticación basada en HMAC en la API web de ASP.NET. Analiza tanto el servicio de API web como el cliente de API web y el código está disponible en bitbucket. http://www.piotrwalat.net/hmac-authentication-in-asp-net-web-api/

Aquí hay una publicación sobre autenticación básica en la API web: http://www.piotrwalat.net/basic-http-authentication-in-asp-net-web-api-using-message-handlers/

Recuerde que si va a proporcionar una API a terceros, probablemente también será responsable de entregar las bibliotecas de los clientes. La autenticación básica tiene una ventaja significativa aquí, ya que es compatible con la mayoría de las plataformas de programación listas para usar. HMAC, por otro lado, no está tan estandarizado y requerirá una implementación personalizada. Estos deben ser relativamente sencillos pero aún requieren trabajo.

PD. También hay una opción para utilizar certificados HTTPS +. http://www.piotrwalat.net/client-certificate-authentication-in-asp-net-web-api-and-windows-store-apps/

c# asp.net-mvc oauth asp.net-web-api

Quiero crear un servicio web RESTful utilizando la API web de ASP.NET que los desarrolladores externos usarán para acceder a los datos de mi aplicación.

He leído mucho sobre OAuth y parece ser el estándar, pero encontrar una buena muestra con documentación que explique cómo funciona (¡y eso realmente funciona!) Parece ser increíblemente difícil (especialmente para un novato en OAuth).

¿Hay una muestra que realmente construye, funciona y muestra cómo implementar esto?

He descargado numerosas muestras:

  • DotNetOAuth: la documentación no tiene remedio desde la perspectiva de un novato
  • Thinktecture - no se puede construir

También he visto blogs que sugieren un esquema simple basado en token (como this ); esto parece re-inventar la rueda pero tiene la ventaja de ser conceptualmente bastante simple.

Parece que hay muchas preguntas como esta en SO pero no hay buenas respuestas.

¿Qué hacen todos en este espacio?




La API web introdujo un atributo [Authorize] para proporcionar seguridad. Esto se puede configurar globalmente (global.asx)

public static void Register(HttpConfiguration config)
{
    config.Filters.Add(new AuthorizeAttribute());
}

O por controlador:

[Authorize]
public class ValuesController : ApiController{
...

Por supuesto, su tipo de autenticación puede variar y es posible que desee realizar su propia autenticación. Cuando esto ocurra, puede encontrar útil la herencia de Atributo de Autorización y extenderla para cumplir con sus requisitos:

public class DemoAuthorizeAttribute : AuthorizeAttribute
{
    public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext)
    {
        if (Authorize(actionContext))
        {
            return;
        }
        HandleUnauthorizedRequest(actionContext);
    }

    protected override void HandleUnauthorizedRequest(System.Web.Http.Controllers.HttpActionContext actionContext)
    {
        var challengeMessage = new System.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.Unauthorized);
        challengeMessage.Headers.Add("WWW-Authenticate", "Basic");
        throw new HttpResponseException(challengeMessage);
    }

    private bool Authorize(System.Web.Http.Controllers.HttpActionContext actionContext)
    {
        try
        {
            var someCode = (from h in actionContext.Request.Headers where h.Key == "demo" select h.Value.First()).FirstOrDefault();
            return someCode == "myCode";
        }
        catch (Exception)
        {
            return false;
        }
    }
}

Y en tu mando:

[DemoAuthorize]
public class ValuesController : ApiController{

Aquí hay un enlace en otra implementación personalizada para Autorizaciones de WebApi:

http://www.piotrwalat.net/basic-http-authentication-in-asp-net-web-api-using-membership-provider/




Continuando con la respuesta de @ Cuong Le, mi enfoque para prevenir el ataque de repetición sería

// Cifre la hora de Unix en el lado del cliente utilizando la clave privada compartida (o la contraseña del usuario)

// Envíelo como parte del encabezado de solicitud al servidor (API WEB)

// Descifre la hora de Unix en el servidor (API de WEB) usando la clave privada compartida (o la contraseña del usuario)

// Verifique la diferencia de tiempo entre la hora de Unix del cliente y la hora de Unix del servidor, no debe ser mayor que x seg.

// si la ID de usuario / contraseña de hash es correcta y el UnixTime descifrado está dentro de x segundos de la hora del servidor, entonces es una solicitud válida




Related