Par programmation connecter un utilisateur à asp.net l'appartenance et les rôles?

Je suis en train de travailler sur un Asp.Net 4.0 application web qui est à l'aide de la composition et Rôles des fonctionnalités de Asp.Net.

Dans la demande, il y aura trois rôles qui ont accès à la page de connexion et un rôle qui ne l'est pas.

La façon dont il est censé travailler, est comme suit.

Dos de l'utilisateur final (dans l'un des trois rôles privilégiés) crée un utilisateur. Dans le code, ce qui est fait par programme plutôt que d'utiliser le Registre de l'Utilisateur page. Lorsque l'utilisateur est créé, ils sont ajoutés pour le second rôle, qui, par souci de clarté, est appelé le Visiteur rôle.

Dos de l'utilisateur final, puis crée un lien pour le nouvel utilisateur qui est dans la forme de https://www.example.com?link=cc82ae24-df47-4dbf-9440-1a6923945cf2

Lorsque le lien est visité, l'application permettra de localiser l'utilisateur associé à la chaîne de requête, obtenir le nom d'utilisateur et le mot de passe (qui sont convenablement hachée et salé) et les journaux de l'utilisateur.

C'est là où je veux en venir annulée. Jusqu'à présent, la création d'un utilisateur travaille bien, à la requête de base de données basé sur la valeur de la chaîne de requête est en train de faire son travail et le retour de l'pertinentes de bits d'information, tout semble être à circuler assez bien, sauf pour l'enregistrement réel. Il ne semble pas être une méthode claire de la déconnexion d'un utilisateur en vue de la programmation, sans passer par le galimatias de l'obtention de l'utilisateur pour se connecter eux-mêmes, qui m'a été dit de manière explicite à éviter.

Voici mon code, le "pers" l'objet est une classe qui est rempli à partir de la base de données quand ils débarquent sur la page par défaut du lien:

protected void LogUserIn(string p)
{
SqlConnection conn = UtilityMethods.GetConnection();
Guid par = Guid.Parse(p);
BioProspect pers= new BioProspect(conn);
pers.FillDetailsFromDb(par);
testlable.Text = pers.ToString();
Response.Cookies.Remove(FormsAuthentication.FormsCookieName);
try
{
if (Membership.ValidateUser(pers.Email, pers.Pword))
{
FormsAuthentication.SetAuthCookie(pers.Email, true);
Response.Redirect(Request.Url.Scheme + "://" + Request.Url.Host + "/About.aspx");
testlable.Text = "Logged in!";
}
else
{
throw new Exception("Something went wrong");
}
}
catch (Exception ex)
{
StringBuilder sb = new StringBuilder();
foreach (DictionaryEntry d in ex.Data)
{
sb.Append(d.Key.ToString());
sb.Append(": ");
sb.Append(d.Value.ToString());
sb.Append("\r\n");
}
AMessage(sb.ToString());
}
}

Maintenant, j'ai vérifié les valeurs de nom d'utilisateur et un mot de passe sur la table de base de données elle-même et il est tout à fait correct. Je comprends le mot de passe stocké dans le réseau des tables a été salées et hachées, je suis donc vérifier les valeurs dans une table temporaire, j'ai créé pour tenir le texte en clair. C'est à droite. En outre, dans le code ci-dessus, le FormsAuthentication.SetAuthCookie méthode demande un nom d'utilisateur et le mot de passe dans ce cas - ci, le nom d'utilisateur est l'adresse e-mail. Cette information est également correcte lors de l'inspection au cours de débogage.

Je me dois de souligner, liens qui nous envoi sont à peu près une heure de liens. Chaque fois qu'une modification est apportée à cette utilisateur, la valeur des paramètres de la liaison va changer et le lien sera complètement inutile. La page, ils seront redirigés vers tiendra les documents qui sont directement pertinentes pour l'utilisateur particulier et pas les autres.

Cependant, nous avons encore besoin des avantages de l'Asp.Net l'Adhésion, des Profils et des Rôles cadre de, depuis le "Visiteur" peut très bien avoir plusieurs liens envoyés, avec les différents documents et les versions des documents ajoutés et modifiés au fil du temps.

Peut-on imaginer une meilleure façon? Je l'ai regardé la plupart de ces entrées ici et ici mais ils semblent tous un peu incomplète.

MODIFIER

Me semble que j'ai au moins partiellement résolu ce, à l'aide des informations recueillies à partir de la accepté de répondre à ici

Essentiellement, le problème était de mon site web.config section adhésion devait être dit quel algorithme de hachage à utiliser. Pour le moment, je n'ai aucune idée de ce que le défaut est, si il y en a un, mais l'ajout de

<membership hashAlgorithmType="SHA1">

sur le web.config a au moins permis de me connecter les utilisateurs créés après la ligne ci-dessus a été ajouté. La prochaine étape est pour moi de comprendre pourquoi je ne peux pas obtenir les autres utilisateurs connectés.

Je suis cependant encore l'obtention d'un ThreadAbortException comme suggéré par Joe, que je suis maintenant occupés à résoudre.

OriginalL'auteur inksmithy | 2012-05-18