1

Je souhaite utiliser les vues ASP.NET MVC comme moteur de modèle de courrier. Pour cela, j'appelle une action du contrôleur d'une autre action du contrôleur en utilisant un System.ComponentModel.Component.WebClient, parser la page web retournée et l'envoyer par e-mail.Est-il possible de transférer l'identité FormsAuthentication de l'utilisateur actuel vers une autre action du contrôleur?

Dans ce scénario, est-il possible de transférer les informations de connexion de l'utilisateur actuel (j'utilise FormsAuthentication) à l'action du contrôleur demandée par WebClient? Les mots de passe des utilisateurs sont cryptés, donc je ne peux pas créer une nouvelle instance de NetworkCredentials avec son nom d'utilisateur et son mot de passe.

Répondre

5

Oui, vous pouvez simplement copier le cookie .ASPXAUTH de votre objet Request courant au WebClient

EDIT: Je ne l'ai pas vraiment essayé moi-même, peut-être le cookie .ASPXAUTH est retiré de l'objet de demande de raisons de sécurité. Mais comme vous avez accès à la clé machine, vous pouvez créer vos propres cookies à la volée. Voici le code qui devrait le faire (je ne peux pas trouver le projet où je fait l'ai fait)

var ticket = new FormsAuthenticationTicket(User.Identity.Name, true, 5); 
string aspxAuthCookieValue = FormsAuthentication.Encrypt(ticket); 

Ce code crée un cookie d'authentification de formulaires pour votre nom d'utilisateur et avec un délai d'expiration de 5 minutes.

+0

Ça sonne bien et je compris la partie webclient de mettre un cookie, mais comment puis-je lire .ASPXAUTH? Pour une raison quelconque, le terme suivant est vrai, même si je suis connecté: requestContext.HttpContext.Response.Cookies [". ASPXAUTH"]. Value.Length == 0 –

+0

J'ai ajouté un moyen de contourner ce problème dans ma réponse – chris166

+1

Il suffit de lire à nouveau votre commentaire: vous devriez regarder dans HttpContext.REQUEST pas RESPONSE! – chris166

1

Au lieu d'effectuer une demande http, ne vous cherchez quelque chose comme « rendering a view to a string »

+1

C'est ce que j'ai essayé en premier, mais après beaucoup de googler et essayer différentes approches pour ce faire (qui ne fonctionnaient pas avec ASP.NET MVC 1.0 final), j'ai choisi un client web à la place. La performance n'est pas un problème ici, donc je ne me soucie pas vraiment des frais généraux. –

Questions connexes