Authentification D'Une Seule Page D'Application
mon entreprise est en train de réécrire son site de commerce électronique en une seule page en utilisant les nouvelles fonctionnalités de L'API / SPA Web dans MVC 4. Nous ne sommes pas sûr de la meilleure façon de gérer l'authentification.
questions spécifiques:
Comment traitons-nous les communications cryptées et non cryptées? Clairement, nous avons besoin D'utiliser HTTPS pour le login, compte, et checkOut AJAX, mais nous aimerions utiliser HTTP pour parcourir le catalogue afin d'éviter des poignées de main SSL coûteuses qui permettrait de ralentir l'ensemble du site vers le bas. Est-ce même possible pour un SPA, ou sommes-nous coincés avec HTTPS pour tout?
Quel type d'authentification doit-on utiliser? Principalement notre site sera accédé à partir d'un navigateur web, de sorte que les cookies peuvent être très bien. Mais plus tard, nous pourrions vouloir faire une application iPhone personnalisée. Est-ce que L'authentification de base, OpenId, ou OAUTH est préférable? Si oui, pourquoi?
- si nous allons avec les formulaires Auth et les cookies, le redirection question être fixé pour la sortie de MVC 4, ou dois-je utiliser le haack?
- si nous allons avec L'authentification de base, Comment faites-vous les sessions persistantes, de sorte que les utilisateurs ne doivent pas se connecter à chaque fois qu'ils vont à la page à nouveau.
- quelles méthodes d'authentification sont bien supportées par ASP.NET MVC 4. Il serait idéal de ne pas avoir à écrire beaucoup de code spécialisé.
Merci d'avance
3 réponses
1. Comment traitons-nous les communications cryptées et non cryptées? Nous sommes coincés avec un protocole https, avec un spa?
Vous n'êtes pas coincé avec un protocole. Avec un spa, vous pouvez utiliser ajax pour communiquer par http ou https, quel que soit celui que vous choisissez à tout moment. J'utiliserais https pour chaque fois que vous envoyez des informations sensibles comme le nom d'une personne ou sa date de naissance ou ses identifiants de connexion.
une fois qu'un utilisateur se connecte à votre site via https puis votre serveur peut définir un cookie d'authentification forms pour cet utilisateur. Ce cookie doit être une valeur chiffrée qui lie leur session au serveur. Vous devez être conscient que si le reste de votre site utilise http alors vous avez le risque que ce cookie soit passé au-dessus du fil dans le texte simple. Même si le contenu du cookie peut être crypté, en utilisant un algorithme de cryptage de votre choix, une personne malveillante peut voler ce cookie et pirater la session de votre utilisateur.
Ce ne serait pas une grosse affaire pour vous cependant si ils sont seulement autorisés à parcourir le site et de créer un panier d'achat. Une fois que l'utilisateur est prêt à payer, vous devez ré-authentifier l'utilisateur, via https, comme une sorte de double vérification pour s'assurer qu'ils ne sont pas un utilisateur malveillant. Amazon ne ce.
2. Quel type d'authentification doit-on utiliser?
Eh bien, c'est une question de ce que vous voulez que votre site ait.
OAuth est pour exposer les services web qui vous pouvez autoriser d'autres sites pour appeler avec un accès délégué. Cela signifie que si vous avez un utilisateur qui veut un autre site (site x) pour être en mesure d'accéder aux fonctionnalités sur votre site pour leur profil. Le site x peut rediriger l'utilisateur vers un autre terminal de votre site qui authentifiera l'utilisateur. Votre oauth point de terminaison va demander à l'utilisateur si bien que certaines caractéristiques sont partagées avec le site x et si l'utilisateur accepte un jeton généré. L'utilisateur passe ce token au site x où le site x faites des appels de serveur à serveur à votre site. Site x présentera le jeton dans les appels les appels à vos services seront un accès délégué appel. OAuth est une façon de fournir d'autres sites pour rendre l'accès délégué à vos services. J'espère que j'ai été en mesure d'expliquer clairement.. Je ne suis pas toujours bon à cela.
OpenID n'est pas un moyen très sûr de gérer l'authentification son plus d'une commodité de sorte que les utilisateurs n'ont pas à être embêtés avec l'enregistrement d'un compte avec votre site. Comme OpenID est complètement ouvert, vous faites confiance à un autre fournisseur pour valider vos utilisateurs. Si le magasin utilisateur du tiers fournisseur est compromis alors vos utilisateurs sont également compromis. C'est un exemple de système de coupons où vous dites en gros que je ferai confiance à qui vous dites être, si vous pouvez avoir un garant OpenID provider pour vous.
une Autre solution est WS-Federation. WS-Fédération est si vous avez plusieurs sites et vous voulez avoir 1 fournisseur d'authentification qui vous avez confiance. Ce fournisseur d'authentification peut être le vôtre et essentiellement tous vos sites disent Si vous voulez accéder à mon site alors vous devez d'abord être authentifié avec mon fournisseur d'authentification. Ce fournisseur d'authentification peut vivre sur un domaine séparé et peut choisir n'importe quel mécanisme d'authentification qu'il choisit. Vous êtes confiant que ce fournisseur d'auth fera son meilleur travail pour gérer vos comptes d'utilisateurs.
ws-la Fédération peut être exagérée cependant si vous voulez seulement authentification sur votre site et ne pas avoir plusieurs sites. Dans ce cas, je recommande de faire L'Authentification De Formulaires et ce devrait être assez simple à faire. Il y a beaucoup d'exemples de la façon de le faire et microsoft fournit de nombreuses solutions pour savoir comment faire cela. Vous devriez envisager de créer un fournisseur d'abonnement personnalisé.
une Fois qu'un utilisateur a été authentifié avec votre site, vous devez créer un cookie d'authentification de formulaires. Ce cookie lie l'utilisateur à sa session sur le serveur. Ceci s'applique à tous les scénarios décrits ci-dessus. MVC 4 prend également en charge tous les scénarios énumérés ci-dessus.
Merci, et n'hésitez pas à poser plus de questions, si je n'étais pas assez claire.
** EDIT 12/1/2017 ** Pour revenir à cette question des années plus tard, j'ai appris que compter sur les cookies pour les API repos basé n'est pas une bonne idée. Vous ne voulez pas créer une session sur votre application web, car il rend votre application plus difficile à échelle. Ainsi, si vous avez besoin d'authentification, utilisez HTTPS avec une forme d'authentification (BASIC, DIGEST, Token Based, etc.)..). Ainsi, votre application client SPA définira l'en-tête D'autorisation sur chaque requête http et ensuite votre application serveur web ré-authentifiera chaque requête.
le principal inconvénient de l'utilisation ASP.NET la sécurité basée sur la forme est qu'elle suppose que vous voulez une page web 401 lorsque votre authentification échoue (inutile lorsque vous faites un appel AJAX) et il est vraiment conçu autour de faire des redirections qui casse genre tout le modèle SPA. Vous pouvez le contourner, mais il n'est pas conçu pour le but que vous utilisez.
cette boîte à outils peut offrir une solution de rechange ASP.NET"comme modèle. Je ne sais pas encore à quel point il est mature ...
Commentaires de bienvenue.
je viens tout juste de commencer à travailler avec webapi moi-même, alors ne considère pas ma réponse comme autoritaire. Je ne suis pas un expert en sécurité bien que je devrais être. Je suis tombé sur les mêmes questions que vous et j'ai trouvé, comme vous, qu'il y avait pas de réponse faisant autorité - dans mvc webapi. Regarder d'autres spécifications webapi peut vous donner un peu d'inspiration.
le moyen le plus simple que j'ai trouvé était bien sûr D'utiliser SSL. Qui vous permet de sortir avec envoyer des informations d'authentification en texte clair dans le tête. Ne brise pas le repos.
mon api va employer SSL tout le chemin mais je voulais doubler quand même. Donc j'envoie une clé cryptée dans le questionnaire pour toutes mes requêtes. À peu près comme l'authentification sans cookie fonctionne pour un site asp non api, mais mvc ne joue pas avec, donc j'ai lancé ma propre solution.
sur un site mobile, l'utilisateur se connecte, est redirigé vers l'application avec la clé cryptée codée dans le js. Il va donc d'abord avoir un auteur basé sur la cuisine pour le site, et être responsable de sa protection, sauvegarde de mot de passe, etc.
un autre consommateur d'api obtiendrait un "secret" plus permanent à partir d'un site de développement qui n'a pas encore été créé et l'utiliserait pour vérifier une clé.
normalement l'authentification mvc est apatride, ce qui signifie que le ticket n'est jamais invalidé côté serveur. Si vous contrôlez le client, vous pouvez simplement ignorer les requêtes invalider les cookies si le serveur vous déconnecte, et continuer à réutiliser le ticket. Eventuelly vous voudrez peut-être garder le suivi de vos billets côté serveur, mais ce n'est pas apatride, le doute si c'est de la détente, et par conséquent, l'évolutivité taket un coup. Mais l'authentification est assez importante donc...