2015-09-14 2 views
1

J'ai créé un site Web avec une page qui comprend un formulaire de rasoir. L'utilisateur peut se connecter sur ce formulaire, puis redirige vers une page différente. La connexion (et la déconnexion) fonctionne correctement avec formsauthentication. Cependant, je n'arrive pas à utiliser HttpContext.Current.User.Identity.Name pour récupérer le nom d'utilisateur stocké (dans le cookie formsauthentication). Il renvoie une chaîne vide "". J'utilise MVC 5 et ASP 4.5 sans fournisseur de rôle ou de rôle standard.Utilisation de formsauthentication pour la connexion et l'utilisation HttpContext.Current.User.Identity

Connexion:

[HttpPost] 
     public ActionResult Login(User user) 
     { 
      if (ModelState.IsValid) 
      { 
       bool authenticated = userscontroller.isAuthorized(user.Email, user.Password); 
       if (authenticated) 
       { 
        if (userscontroller.isAuthenticated()) 
        { 
         userscontroller.deAuthenticateUser(); 
        } 
        userscontroller.authenticateUser(user); 
        return Redirect(Url.Action("Index", "Home")); 
       } 
      } 
     } 

Authentification de l'utilisateur:

public void authenticateUser(User user) 
    { 
     FormsAuthentication.SetAuthCookie(user.Username, false); 
    } 

ensuite obtenir le nom de l'utilisateur:

public User userFromCookie() 
{ 
    if (isAuthenticated()) 
    { 
     return getUserByUsername(HttpContext.Current.User.Identity.Name); 
    } 
    else { return null; } 
} 

isAuthenticated()

public bool isAuthenticated() 
{ 
    if (System.Web.HttpContext.Current.User.Identity.IsAuthenticated) 
    { 
     return true; 
    } 
    else 
    { 
     return false; 
    } 
} 

Webconfig:

<authentication mode="Forms"> 
    <forms loginUrl="~/Account/Login" timeout="2880" /> 
</authentication> 
<authorization > <deny users="?"/> </authorization> 

Ainsi, les retours identity.name "".

L'aide est appréciée!

+0

Cela n'a rien à voir avec Classic ASP. – Paul

+1

@Kraishan Vous n'avez pas mentionné si vous utilisez ASP.NET/MVC et la version etc. Indiquez si vous utilisez un fournisseur d'appartenance ou des revendications, etc. –

+0

Je n'ai pas mis en ASP classique dans le taglist, il a changé lui-même apparemment. Comme je l'ai maintenant déclaré dans le post principal, j'utilise MVC5 sans les fournisseurs d'adhésion/rôle. Et ASP 4.5. Merci d'avoir répondu! – Kraishan

Répondre

4

Causes possibles: cela ne fonctionne pas.

  1. Vous appelez simplement le problème. Essayez this.User.Identity.Name
  2. Le cookie n'étant pas conservé dans l'objet Response, l'utilisateur n'est pas authentifié lors de la prochaine requête.
  3. Votre web.config n'est pas configuré pour utiliser l'authentification par formulaires avec les cookies.

Voici un exemple complet que j'ai créé pour vous. Tout cela fonctionne, la seule dépendance est sur une bibliothèque Newtonsoft mais vous pouvez supprimer cela et mettre tout ce que vous voulez dans les données de l'utilisateur.

Voici le contrôleur utilisateur

using System; 
using System.Web; 
using System.Web.Mvc; 
using System.Web.Security; 

namespace TestAuth.Controllers 
{ 
    public class UserModel 
    { 
     public string UserName { get; set; } 
     public string Password { get; set; } 
     public bool RememberMe { get; set; } 
    } 

    public class UserInfo 
    { 
     public string UserName { get; set; } 
    } 

    public class UserController : Controller 
    { 
     [AllowAnonymous] 
     public ActionResult Login() 
     { 
      var model = new UserModel() {Password = "password",UserName = "ItsMe", RememberMe = true}; 
      var serializedUser = Newtonsoft.Json.JsonConvert.SerializeObject(model); 

      var ticket = new FormsAuthenticationTicket(1, model.UserName, DateTime.Now, DateTime.Now.AddHours(3), model.RememberMe, serializedUser); 
      var encryptedTicket = FormsAuthentication.Encrypt(ticket); 
      var isSsl = Request.IsSecureConnection; // if we are running in SSL mode then make the cookie secure only 

      var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket) 
      { 
       HttpOnly = true, // always set this to true! 
       Secure = isSsl, 
      }; 

      if (model.RememberMe) // if the user needs to persist the cookie. Otherwise it is a session cookie 
       cookie.Expires = DateTime.Today.AddMonths(3); // currently hard coded to 3 months in the future 

      Response.Cookies.Set(cookie); 

      return View(); // return something 
     } 

     [Authorize] 
     public ActionResult ShowUserName() 
     { 
      return View(new UserInfo() {UserName = this.User.Identity.Name}); 
     } 
    } 
} 

Voici les vues. Voir Login.cshtml

Logged in 
<br/> 

@Html.ActionLink("Show the user their name", "ShowUserName", "User") 

Voir ShowUserName.cshtml

@model TestAuth.Controllers.UserInfo 

<h2>title</h2> 
user name = @Model.UserName 

section web.config Notez que la clé a été générée à partir de certains sites Web qui est venu dans un recherche Google. Vous devriez probablement chercher à obtenir votre propre et avec les types de cryptage correct que le site que j'ai utilisé était un peu daté.

<system.web> 
     <authentication mode="Forms"> 
      <forms name="myAuthCookie" ticketCompatibilityMode="Framework40" cookieless="UseCookies" requireSSL="false" timeout="180" protection="Encryption" /> 
     </authentication> 
     <machineKey 
    validationKey="DA87693F33607268657E61BCF16D2EAFE339ECE0F6C9B94DFA0FE5BBCA0035EB320F81662A32D98F0A0D2A5DCBE3E678EDF216FBD45CB8BD6F13489D1548214C" 
    decryptionKey="26F44FEF28C3466FAB261CEF4844535678578C6658F85C6ADAE17A99B0947468" 
    validation="SHA1" decryption="AES"/> 


     <compilation debug="true" targetFramework="4.6"/> 
    <httpRuntime targetFramework="4.6"/> 
    </system.web> 
+0

Vous avez sauvé ma journée! Merci pour cette réponse spot-on! – Kraishan

+0

@Kraishan - Content que je puisse être utile. – Igor