2010-07-22 6 views
0

Lorsqu'un utilisateur se connecte avec l'implémentation par défaut du service d'appartenance dans un projet ASP.NET MVC, il est connecté avec un nom d'utilisateur quel que soit le cas lors de la connexion.Appartenance à ASP.NET MVC - mauvais type de nom d'utilisateur utilisé

Par exemple, je crée un utilisateur appelé John. Si je me connecte alors comme joHN, alors User.Identity.Name sera égal à joHN. Je voudrais qu'il égalise John, le nom de connexion de l'utilisateur réel.

En ce moment je suis en train autour de cette façon:

var membershipUser = Membership.GetUser(model.UserName); 
var membershipUserName = Membership.GetUserNameByEmail(membershipUser .Email); 
FormsService.SignIn(membershipUserName, model.RememberMe); 

au lieu de l'implémentation par défaut:

FormsService.SignIn(model.UserName, model.RememberMe); 

Il semble un peu tortueuse. Y a-t-il une meilleure manière de faire cela?

+0

Quel est le problème avec l'affichage du nom de connexion de la façon dont l'utilisateur l'a saisi? – DOK

+0

Le nom de l'utilisateur est ensuite utilisé dans un système sensible à la casse. Donc quand il voit john, il ne réalise pas que c'est le même utilisateur que John. –

Répondre

3

Le nom d'utilisateur est insensible à la casse dans la pile du fournisseur et le principal est défini avec la valeur utilisée pour l'authentification.

Si vous devez appliquer la sensibilité à la casse, vous devez soit protéger tous les points d'authentification lorsque vous décrivez ou implémentez une entité/identité personnalisée.

Je recommande fortement le premier et priera pour vous si vous choisissez le second. ;-)

Bonne chance.

+2

priant à ce sujet semble un peu extrême, il est presque le week-end - ne pas oublier de le prendre mec facile :) –

+0

Aucune chance je prends la dernière option! Merci. –

1

Vous pouvez toujours appliquer votre propre étui. Comme si ce sont des vrais noms des gens (même si certains noms étranges), vous pouvez simplement quelque chose comme:

TextInfo culture = new CultureInfo("en-US", false).TextInfo; 
    FormsService.SignIn(culture.ToTitleCase(model.UserName), model.RememberMe); 

et en faire cas de titre. Bien sûr, ce n'est pas 100% ce que vous avez demandé, mais il pourrait être meilleur que votre solution actuelle (car cela permet d'économiser un appel à la base de données au moins).

+0

ToTitleCase, intéressant - n'était pas au courant de cette méthode. –

Questions connexes