50 votes

Authentification multiplateforme à l'aide de l'API Web ASP.NET

Comment puis-je commencer à coder l'authentification à l'aide de l'API Web ASP.NET afin qu'elle soit multiplateforme et prenne en charge les ordinateurs de bureau, les téléphones mobiles et le Web ? J'ai lu certaines méthodes d'authentification RESTful, comme l'utilisation de jetons dans l'en-tête.

Existe-t-il des exemples de projets qui utilisent cette méthode ?

Questions :

  1. Sinon, comment puis-je réparer le [Authorize] pour lire le jeton ?
  2. Comment puis-je générer ce jeton ? Je ne pense pas pouvoir utiliser l'authentification par formulaire car elle utilise des cookies.
  3. Comment dois-je gérer l'autorisation proprement dite ? Le client envoie-t-il un mot de passe et un nom d'utilisateur bruts, puis je génère le jeton ou y a-t-il un autre moyen ?
  4. Comment gérer le fait que mon site web l'utilise ? J'ai entendu dire que la gestion est différente de celle d'une application, notamment en ce qui concerne l'obtention du domaine et son autorisation.

42voto

cecilphillip Points 4020

Je pense que les jetons seraient une bonne solution. L'authentification des formulaires est basée sur les cookies pour le web. Ce n'est pas la situation la plus idéale pour tous les clients qui ne sont pas des navigateurs.

Je vous suggère de créer un AuthorizationFilterAttribute personnalisé et de remplacer la méthode OnAuthorization. Dans cette méthode, vous pourriez vérifier l'existence d'un jeton que vous avez délivré au client après qu'il ait fourni des informations d'identification valides. Vous pouvez utiliser cet attribut sur n'importe quelle méthode ou contrôleur que vous souhaitez valider. Voici un exemple auquel vous pouvez vous référer

 public class AuthorizeTokenAttribute : AuthorizationFilterAttribute 
{      
    public override void OnAuthorization(HttpActionContext actionContext)
    {
        if (actionContext != null)
        {                
                if (!AuthorizeRequest(actionContext.ControllerContext.Request))
                {
                    actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized) { RequestMessage = actionContext.ControllerContext.Request }; 
                }
                return;
        }
    }

    private bool AuthorizeRequest(System.Net.Http.HttpRequestMessage request)
    {
        bool authorized = false;
        if (request.Headers.Contains(Constants.TOKEN_HEADER))
        {               
            var tokenValue = request.Headers.GetValues("TOKEN_HEADER");
            if (tokenValue.Count() == 1) {
                var value = tokenValue.FirstOrDefault();               
               //Token validation logic here
               //set authorized variable accordingly
            }                
        }
        return authorized;
    } }

TOKEN_HEADER est juste une chaîne représentant un en-tête HTTP que le client doit renvoyer pour les demandes authentifiées.

Alors allons-y.

  1. Le client demande des données sécurisées
  2. Le client n'est pas autorisé, renvoyer une réponse avec un code d'état "Non autorisé".
  3. Le client envoie des informations d'identification pour s'authentifier, qui doivent être sécurisées via HTTPS.
  4. Une fois validé, le client reçoit un jeton par le biais d'un en-tête HTTP, ou ce qui vous convient.
  5. Le client tente à nouveau de demander des données sécurisées, en joignant cette fois le jeton à la demande.
  6. L'attribut AuthorizeTokenAttribute validera le jeton et permettra l'exécution de l'action.

Consultez également ce billet de John Petersen. Sécuriser vos API Web ASP.NET

21voto

Maurice Points 22343

Il existe de nombreuses façons d'authentifier les utilisateurs d'un service REST. L'utilisation de jetons est possible, mais la simple utilisation de Authentification de base est encore plus simple et à peu près aussi standard et multiplateforme que possible.

Ne confondez pas autorisation con authentification . L'attribut [Authorize] concerne l'autorisation, mais uniquement après qu'un utilisateur ait été authentifié par un autre mécanisme. L'autorisation est totalement inutile sans une authentification correcte au préalable.

La meilleure ressource à consulter est Dominick Baier qui est un expert en la matière.

2voto

user1344426 Points 21

J'utilise une approche très simple :

  1. définir un profil d'accès avec son accessId et son accessKey uniques (par exemple, une valeur GUID hachée MD5)
  2. stocker ce profil d'accès dans la base de données
  3. chaque requête (GET/POST/etc.) doit fournir accessId, queryHash (valeur de hachage MD5 représentant la requête) et signature (valeur de hachage MD5 de queryHash + accessKey). Bien entendu, le client doit conserver la clé d'accès dans un endroit sûr !
  4. Le serveur reçoit la demande et vérifie l'accessId et la signature en utilisant le même algorithme de calcul pour rejeter ou accorder l'accès (authentification).
  5. une autorisation supplémentaire peut être effectuée sur la base du type de demande en utilisant le profil d'accès.

Avec cette approche, le service utilisant la nouvelle API web ASP.NET MVC peut servir n'importe quel type de client : navigateur/javascript et natif (bureau ou mobile) etc.

0voto

Mian Points 66

Vous pouvez utiliser l'attribut ActionFilterAttribute et remplacer la méthode OnActionExecuting. Plus tard, enregistrez ce filtre dans global.cs pour l'appliquer à toutes les actions, comme ceci dans la méthode Application Start

var config = GlobalConfiguration.C config.Filters.Add(new CustomAuthAttribute ()) ;

{ espace de noms Customss { Public class CustomAuthAttribute : ActionFilterAttribute

{

    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        // To inforce HTTPS if desired , else comment out the code
        if (!String.Equals(actionContext.Request.RequestUri.Scheme, "https", StringComparison.OrdinalIgnoreCase))
        {
            actionContext.Response = new HttpResponseMessage(System.Net.HttpStatusCode.BadRequest)
            {
                Content = new StringContent("HTTPS Required")
            };
            return;
        }

       // get toekn from the header

        var userToken = actionContext.Request.Headers.GetValues("UserToken");
         // Customer Logic to check the validity of the token.
        // U can have some DB logic to check , custom STS behind or some loca cache used to compare the values

    }

}

} }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X