Ce sujet a été incroyablement déroutant pour moi. Je suis un débutant dans les applications HTTP, mais je dois développer un client iPhone qui consum des données JSON quelque part. J’ai choisi l’API Web de MS parce que cela semblait assez simple, mais quand il s’agit d’authentifier les utilisateurs, les choses deviennent assez frustrantes.
Je suis étonné de voir que je n’ai pas été en mesure de trouver un exemple clair de la façon d’authentifier un utilisateur depuis l’écran de connexion jusqu’à l’utilisation de l’atsortingbut Authorize
sur mes méthodes ApiController
après plusieurs heures de recherche sur Google.
Ce n’est pas une question mais une demande pour un exemple de comment faire exactement cela. J’ai regardé les pages suivantes:
Même si elles expliquent comment gérer les requêtes non autorisées, celles-ci ne démontrent pas clairement quelque chose comme un LoginController
ou quelque chose du genre pour demander des informations d’identification et les valider.
Quiconque est prêt à écrire un bel exemple simple ou à me diriger dans la bonne direction, s’il vous plaît?
Merci.
Je suis étonné de voir que je n’ai pas été en mesure de trouver un exemple clair de la façon d’authentifier un utilisateur depuis l’écran de connexion jusqu’à l’utilisation de l’atsortingbut Authorize sur mes méthodes ApiController après plusieurs heures de recherche sur Google.
C’est parce que vous êtes confus au sujet de ces deux concepts:
L’authentification est le mécanisme par lequel les systèmes peuvent identifier en toute sécurité leurs utilisateurs. Les systèmes d’authentification apportent une réponse aux questions suivantes:
L’autorisation est le mécanisme par lequel un système détermine le niveau d’access qu’un utilisateur authentifié doit avoir pour sécuriser les ressources contrôlées par le système. Par exemple, un système de gestion de firebase database peut être conçu pour permettre à certaines personnes spécifiques d’extraire des informations d’une firebase database, mais pas de modifier les données stockées dans la firebase database. Les systèmes d’autorisation fournissent des réponses aux questions:
L’atsortingbut Authorize
dans MVC est utilisé pour appliquer les règles d’access, par exemple:
[System.Web.Http.Authorize(Roles = "Admin, Super User")] public ActionResult AdministratorsOnly() { return View(); }
La règle ci-dessus autorisera uniquement les utilisateurs des rôles Admin et Super User à accéder à la méthode.
Ces règles peuvent également être définies dans le fichier web.config, en utilisant l’élément location
. Exemple:
Toutefois, avant d’exécuter ces règles d’autorisation, vous devez être authentifié sur le site Web actuel .
Même si elles expliquent comment gérer les requêtes non autorisées, celles-ci ne démontrent pas clairement quelque chose comme un LoginController ou quelque chose du genre pour demander des informations d’identification et les valider.
De là, nous pourrions diviser le problème en deux:
Authentification des utilisateurs lors de l’utilisation des services API Web dans la même application Web
Ce serait l’approche la plus simple, car vous vous fiez à l’ authentification dans ASP.Net.
Voici un exemple simple:
Les utilisateurs seront redirigés vers le compte / itinéraire de connexion , vous y rendrez des contrôles personnalisés pour demander des informations d’identification de l’utilisateur, puis vous définirez le cookie d’authentification à l’aide de:
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 multi-plateforme
Dans ce cas, vous exposez uniquement les services d’API Web dans l’application Web. Par conséquent, un autre client peut utiliser les services, le client peut être une autre application Web ou une application .Net (Win Forms, WPF, console, service Windows, etc.). etc)
Par exemple, supposons que vous utilisiez le service API Web à partir d’une autre application Web sur le même domaine réseau (dans un intranet). Dans ce cas, vous pouvez vous fier à l’authentification Windows fournie par ASP.Net.
Si vos services sont exposés sur Internet, vous devez transmettre les jetons authentifiés à chaque service d’API Web.
Pour plus d’informations, jetez un coup d’oeil aux articles suivants:
Si vous souhaitez vous authentifier avec un nom d’utilisateur et un mot de passe et sans cookie d’autorisation , l’atsortingbut MVC4 Authorize ne fonctionnera pas immédiatement. Toutefois, vous pouvez append la méthode d’assistance suivante à votre contrôleur pour accepter les en-têtes d’authentification de base. Appelez-le depuis le début des méthodes de votre contrôleur.
void EnsureAuthenticated(ssortingng role) { ssortingng[] parts = UTF8Encoding.UTF8.GetSsortingng(Convert.FromBase64Ssortingng(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é du client, cet assistant crée un HttpClient
avec l’en-tête d’authentification en place:
static HttpClient CreateBasicAuthenticationHttpClient(ssortingng userName, ssortingng password) { var client = new HttpClient(); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64Ssortingng(UTF8Encoding.UTF8.GetBytes(userName + ':' + password))); return client; }
Je travaille sur un projet d’API MVC5 / Web et je devais pouvoir obtenir une autorisation pour les méthodes Web Api. Lorsque ma vue d’index est chargée pour la première fois, j’appelle la méthode d’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 enregistré, qui enregistre le jeton d’authentification localement:
saveAccessToken = (response) -> window.authenticationToken = response.access_token
Ensuite, si j’ai besoin d’appeler Ajax vers une méthode d’API Web dotée de la balise [Authorize], j’ajoute simplement l’en-tête suivant à mon appel Ajax:
{ "Authorization": "Bearer " + window.authenticationToken }