148 votes

Authentification des utilisateurs dans ASP.NET Web API

Ce sujet a été incroyablement confus pour moi. Je suis un débutant dans les applications HTTP mais je dois développer un client iPhone qui consomme des données JSON de quelque part. J'ai choisi l'API Web de MS parce qu'elle semblait assez facile, mais lorsqu'il s'agit d'authentifier les utilisateurs, les choses deviennent assez frustrantes.

Je suis étonné de ne pas avoir pu trouver un exemple clair de la manière d'authentifier un utilisateur, depuis l'écran de connexion jusqu'à l'utilisation de l'icône de l'utilisateur. Authorize sur mon ApiController après plusieurs heures de recherche sur Google.

Il ne s'agit pas d'une question mais d'une demande d'exemple pour savoir comment procéder exactement. J'ai consulté les pages suivantes :

Même si elles expliquent comment traiter les demandes non autorisées, elles ne démontrent pas clairement quelque chose comme une LoginController ou quelque chose comme ça pour demander les informations d'identification de l'utilisateur et les valider.

Quelqu'un est-il prêt à rédiger un exemple simple ou à m'indiquer la bonne direction ?

Merci.

177voto

Jupaol Points 12825

Je suis étonné de ne pas avoir pu trouver un exemple clair de la manière d'authentifier un utilisateur depuis l'écran de connexion jusqu'à l'utilisation de l'attribut Authorize sur mes méthodes ApiController après plusieurs heures de recherche sur Google.

C'est parce que vous êtes en train de confondre ces deux concepts :

  • L'authentification est le mécanisme par lequel les systèmes peuvent identifier de manière sûre leurs utilisateurs. Les systèmes d'authentification fournissent une réponse aux questions suivantes :

    • Qui est l'utilisateur ?
    • L'utilisateur est-il vraiment celui qu'il prétend être ?
  • L'autorisation est le mécanisme par lequel un système détermine le niveau d'accès d'un utilisateur authentifié particulier aux ressources sécurisées contrôlées par le système. Par exemple, un système de gestion de base de données peut être conçu de manière à fournir à certaines personnes spécifiées la capacité de récupérer des informations dans une base de données mais pas la capacité de modifier les données stockées dans la base de données, tout en donnant à d'autres personnes la capacité de modifier les données. Les systèmes d'autorisation fournissent des réponses aux questions suivantes :

    • L'utilisateur X est-il autorisé à accéder à la ressource R ?
    • L'utilisateur X est-il autorisé à effectuer l'opération P ?
    • L'utilisateur X est-il autorisé à effectuer l'opération P sur la ressource R ?

El Authorize dans MVC est utilisé pour appliquer des règles d'accès, par exemple :

 [System.Web.Http.Authorize(Roles = "Admin, Super User")]
 public ActionResult AdministratorsOnly()
 {
     return View();
 }

La règle ci-dessus n'autorisera que les utilisateurs de la Admin y Super utilisateur rôles pour accéder à la méthode

Ces règles peuvent également être définies dans le fichier web.config, à l'aide de l'option location élément. Exemple :

  <location path="Home/AdministratorsOnly">
    <system.web>
      <authorization>
        <allow roles="Administrators"/>
        <deny users="*"/>
      </authorization>
    </system.web>
  </location>

Cependant, avant que ces règles d'autorisation ne soient exécutées, vous devez être authentifié sur le site web actuel .

Même si elles expliquent comment traiter les demandes non autorisées, elles ne présentent pas clairement quelque chose comme un LoginController ou quelque chose du genre pour demander les informations d'identification de l'utilisateur et les valider.

A partir de là, on peut diviser le problème en deux :

  • Authentifier les utilisateurs lorsqu'ils utilisent les services de l'API Web au sein de la même application Web.

    Il s'agit de l'approche la plus simple, car vous vous fiez à l'option Authentification en ASP.Net

    Il s'agit d'un exemple simple :

    Web.config

    <authentication mode="Forms">
      <forms
        protection="All"
        slidingExpiration="true"
        loginUrl="account/login"
        cookieless="UseCookies"
        enableCrossAppRedirects="false"
        name="cookieName"
      />
    </authentication>

    Les utilisateurs seront redirigés vers le site compte/login où vous rendez des contrôles personnalisés pour demander les informations d'identification de l'utilisateur, puis vous définissez le cookie d'authentification à l'aide de l'option :

        if (ModelState.IsValid)
        {
            if (Membership.ValidateUser(model.UserName, model.Password))
            {
                FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
                return RedirectToAction("Index", "Home");
            }
            else
            {
                ModelState.AddModelError("", "The user name or password provided is incorrect.");
            }
        }
    
        // If we got this far, something failed, redisplay form
        return View(model);
  • Authentification multiplateforme

    Ce serait le cas lorsque vous êtes l'exposition des services d'API Web uniquement au sein de l'application Web Le client peut être une autre application Web ou toute application .Net (Win Forms, WPF, console, service Windows, etc.).

    Supposons, par exemple, que vous utilisiez le service API Web à partir d'une autre application Web située sur le même domaine de réseau (au sein d'un intranet). Dans ce cas, vous pourriez vous appuyer sur l'authentification Windows fournie par ASP.Net.

    <authentication mode="Windows" />

    Si vos services sont exposés sur Internet, vous devrez transmettre les jetons authentifiés à chaque service d'API Web.

    Pour plus d'informations, consultez les articles suivants :

15voto

Edward Brey Points 8771

Si vous voulez vous authentifier par rapport à un nom d'utilisateur et mot de passe y sans cookie d'autorisation le MVC4 Autoriser L'attribut ne fonctionnera pas en dehors de la boîte. Cependant, vous pouvez ajouter la méthode d'aide suivante à votre contrôleur pour accepter les en-têtes d'authentification de base. Appelez-la au début des méthodes de votre contrôleur.

void EnsureAuthenticated(string role)
{
    string[] parts = UTF8Encoding.UTF8.GetString(Convert.FromBase64String(Request.Headers.Authorization.Parameter)).Split(':');
    if (parts.Length != 2 || !Membership.ValidateUser(parts[0], parts[1]))
        throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.Unauthorized, "No account with that username and password"));
    if (role != null && !Roles.IsUserInRole(parts[0], role))
        throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.Unauthorized, "An administrator account is required"));
}

Du côté client, cette aide crée un fichier HttpClient avec l'en-tête d'authentification en place :

static HttpClient CreateBasicAuthenticationHttpClient(string userName, string password)
{
    var client = new HttpClient();
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(UTF8Encoding.UTF8.GetBytes(userName + ':' + password)));
    return client;
}

9voto

ProfNimrod Points 746

Je travaille sur un projet MVC5/Web API et j'avais besoin de pouvoir obtenir une autorisation pour les méthodes Web Api. Lorsque ma vue d'index est chargée pour la première fois, je fais un appel à la méthode API Web "token" qui, je pense, est créée automatiquement.

Le code côté client (CoffeeScript) pour obtenir le jeton est le suivant :

getAuthenticationToken = (username, password) ->
    dataToSend = "username=" + username + "&password=" + password
    dataToSend += "&grant_type=password"
    $.post("/token", dataToSend).success saveAccessToken

En cas de succès, l'appel suivant est effectué, ce qui permet de sauvegarder localement le jeton d'authentification :

saveAccessToken = (response) ->
    window.authenticationToken = response.access_token

Ensuite, si j'ai besoin d'effectuer un appel Ajax vers une méthode d'API Web qui possède la balise [Authorize], il me suffit d'ajouter l'en-tête suivant à mon appel Ajax :

{ "Authorization": "Bearer " + window.authenticationToken }

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