2011-08-26 4 views
1

J'ai quelques systèmes qui utilise l'authentification externe, l'authentification google. Je ne fais que garder les informations de connexion dans une variable de session et garder une trace de l'utilisateur de cette façon (pas de fournisseur d'adhésion).Nom d'utilisateur externe fourni comme identité?

Je voudrais avoir l'identité de l'utilisateur dans l'objet HttpContext.Current.User. Devrais-je affecter l'utilisateur manuellement à un événement dans Global.asax.cs ou l'identifier automatiquement pendant la session?

Répondre

1

Utilisez un fournisseur d'adhésion, il vous donnera exactement ce que vous voulez. Même créer votre propre fournisseur n'est pas trop difficile, il suffit d'implémenter la classe abstraite MembershipProvider et de la brancher sur config, ou d'utiliser certains des fournisseurs prêts à l'emploi. Ne pas rouler votre propre solution pour quelque chose de critique comme la sécurité, il aura des failles de sécurité béantes. Le stockage des informations d'authentification dans la session est une très mauvaise idée. Il laisse ouvert le détournement de session, les attaques de relecture de session, etc.

Si vous voulez vraiment suivre la route de l'authentification personnalisée. Ensuite, jetez un oeil sur le code que j'ai posté here. Il vous montrera comment vous pouvez prendre le contrôle du cookie d'authentification et l'utiliserez pour créer votre propre instance HttpContext.Current.User.

+1

Eh bien, le fait d'utiliser le fournisseur d'adhésion ne le rend pas plus sûr. L'authentification intégrée aux formulaires utilise des cookies qui sont vulnérables aux attaques de relecture. –

+0

Oui absolument mais ce n'est pas une raison pour le jeter. L'authentification par formulaires est toujours plus sûre, testée et robuste que n'importe quelle autre solution maison. Le roulement de votre propre approche est vraiment une mauvaise idée. Tirez plutôt parti de FormsAuthentication pour vous protéger contre les attaques de rejeu de session, le détournement de session, etc. La plupart d'entre elles sont bien documentées en termes d'atténuation en s'insérant dans le cadre. La session est beaucoup plus vulnérable aux attaques que l'authentification par formulaires à base de cookies. – TheCodeKing

+0

J'ai ajouté un lien vers un code qui montre comment vous pouvez gérer vous-même le cookie d'authentification si vous le souhaitez. Ce pourrait être plus ce que vous cherchez. – TheCodeKing

2

Vous pouvez écrire un attribut personnalisé qui Autorisez prendra soin d'attribuer la propriété HttpContext.Current.User de la session:

public class MyAuthorizeAttribute : AuthorizeAttribute 
{ 
    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     var user = httpContext.Session["username"] as string; 
     if (string.IsNullOrEmpty(user)) 
     { 
      // we don't have any username inside the session => unauthorized access 
      return false; 
     } 

     // we have a username inside the session => assign the User property 
     // so that it could be accessed from anywhere 
     var identity = new GenericIdentity(user); 
     httpContext.User = new GenericPrincipal(identity, null); 
     return true; 
    } 
} 

décoreront ensuite simplement vos contrôleurs/actions qui nécessitent une authentification avec cet attribut personnalisé.

+0

La session est très peu sécurisée car le cookie de session est simplement un jeton arbitraire. Vous pouvez forcer un identifiant de session spécifique sur quelqu'un relativement facilement. Ensuite, s'il est utilisé pour l'authentification, vous prenez le contrôle de son compte en utilisant vous-même ce jeton. Il est donc préférable d'utiliser le cookie d'authentification qui est un jeton chiffré spécifique à l'utilisateur et au serveur. C'est beaucoup plus difficile à voler. – TheCodeKing

+0

@TheCodeKing, a convenu que les identifiants de session ne sont pas sécurisés et que l'authentification par formulaires standard devrait être utilisée. –

Questions connexes