web-dev-qa-db-fra.com

ASP.net Web API RESTful web service + Authentification de base

J'implémente un service Web RESTful à l'aide d'ASP.Net Web Api. J'ai conclu à utiliser l'authentification de base + SSL pour faire la partie authentification. Quelle est la meilleure/bonne façon de mettre cela en œuvre?

Ma première tentative a été de le faire manuellement, en analysant l'en-tête d'autorisation, en décodant et en vérifiant l'utilisateur par rapport à ma base de données. Cela fonctionne, mais je me demande si je manque quelque chose.

J'ai vu des solutions utilisant des rôles d'utilisateur et des principaux. Bien que je ne sois pas sûr de ce que cela fait réellement, je suis presque sûr que je n'en aurai pas besoin, car dans ma base de données, je définis mes propres utilisateurs et leurs rôles.

De plus, ce que je n'ai pas encore complètement compris, c'est si les consommateurs du service doivent envoyer les informations d'identification à chaque demande ou s'ils sont en quelque sorte mis en cache. Mon service doit-il faire quelque chose pour que cela se produise, ou c'est entièrement au consommateur de gérer cela?

Et une dernière question sur les clients qui font des demandes avec javascript. Y aurait-il des problèmes de "demande interdomaine" s'ils essayaient d'utiliser le service?

34
alfoks

Jamie Kurtze fournit une bonne explication de l'utilisation de l'authentification de base ici API Web ASP.NET REST Bases de la sécurité

D'après ce que je comprends, si vous souhaitez que vos demandes soient sans état, chaque demande nécessitera la définition du champ Authentification

Jamie Kurtze encapsule le code nécessaire dans une classe dérivée de DelegateHandler, tandis que Rick Strahl vérifie si l'appel est valide à l'aide d'un filtre. Vous pouvez en lire plus sur son article de blog sur ce sujet à l'adresse n filtre d'autorisation d'authentification de base WebAPI

30
2D1C

Utilisez l'authentification de base pour la demande initiale (de connexion) en ajoutant un [BasicHttpAuthorize] attribut aux contrôleurs/méthodes appropriés. Spécifiez tilisateurs et Rôles avec l'attribut si vous le souhaitez. Définissez BasicHttpAuthorizeAttribute en tant que spécialiste AuthorizeAttribute comme ceci:

public class BasicHttpAuthorizeAttribute : AuthorizeAttribute
{
    protected override bool IsAuthorized(HttpActionContext actionContext)
    {
        if (Thread.CurrentPrincipal.Identity.Name.Length == 0) { // If an identity has not already been established by other means:
            AuthenticationHeaderValue auth = actionContext.Request.Headers.Authorization;
            if (string.Compare(auth.Scheme, "Basic", StringComparison.OrdinalIgnoreCase) == 0) {
                string credentials = UTF8Encoding.UTF8.GetString(Convert.FromBase64String(auth.Parameter));
                int separatorIndex = credentials.IndexOf(':');
                if (separatorIndex >= 0) {
                    string userName = credentials.Substring(0, separatorIndex);
                    string password = credentials.Substring(separatorIndex + 1);
                    if (Membership.ValidateUser(userName, password))
                        Thread.CurrentPrincipal = actionContext.ControllerContext.RequestContext.Principal = new GenericPrincipal(new GenericIdentity(userName, "Basic"), System.Web.Security.Roles.Provider.GetRolesForUser(userName));
                }
            }
        }
        return base.IsAuthorized(actionContext);
    }
}

Demandez à la réponse initiale d'inclure une clé API pour l'utilisateur. Utilisez la clé API pour les appels suivants. De cette façon, l'authentification du client reste valide même si l'utilisateur change de nom d'utilisateur ou de mot de passe. Cependant, lors du changement de mot de passe, donnez à l'utilisateur la possibilité de "déconnecter les clients", que vous implémentez en supprimant la clé API sur le serveur.

24
Edward Brey
1
leastprivilege