ASP.NET MVC 4 View ( Razor ) + Custom Forms Authentication + HTML Helper – Session 方法

 
ASP.NET MVC 4 View ( Razor ) + Custom Forms Authentication + HTML Helper – Session 方法
 

   web.conf
 
   <?xml version="1.0" encoding="utf-8"?>
 
   <configuration>
 
      … …
 
      <system.web>
 
         … …
 
         <authentication mode="Forms">
            <forms loginUrl="~/Home/Login" timeout="2880" />
         </authentication>
 
         … …
 
      </system.web>
 
   </configuration>
 
   \Views\web.conf
 
   <?xml version="1.0"?>
 
   <configuration>
 
      … …
 
      <system.web.webPages.razor>
         <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
         <pages pageBaseType="System.Web.Mvc.WebViewPage">
            <namespaces>
               <add namespace="System.Web.Mvc" />
               <add namespace="System.Web.Mvc.Ajax" />
               <add namespace="System.Web.Mvc.Html" />
               <add namespace="System.Web.Optimization"/>
               <add namespace="System.Web.Routing" />
               <add namespace="CMS.Library" />
            </namespaces>
         </pages>
      </system.web.webPages.razor>
 
      … …
 
   <configuration>
 
   \Shared\_Layout.cshtml
 
   … …
 
   <section id="login">
      @if (string.IsNullOrEmpty(Session.GetUserInfo().Email))
      {
         @Html.ActionLink("Login", "Login", "Home")
      }
      else
      {
         <text>
            Hello, @Session.GetUserInfo().Email!
            @Html.ActionLink("Logout", "Logout", "Home")
         </text>
      }
   </section>
 
   <nav>
      <ul id="menu">
         <li>@Html.ActionLink("Home", "Index", "Home")</li>
         @if (string.IsNullOrEmpty(Session.GetUserInfo().Email)) {
            <li>@Html.ActionLink("Login", "Login", "Home")</li>
         } else {
            <li>@Html.ActionLink("About", "About", "Home")</li>
            <li>@Html.ActionLink("Contact", "Contact", "Home")</li>
            <li>@Html.ActionLink("Logout", "Logout", "Home")</li>
         }
      </ul>
   </nav>
 
   … …
 
   \Home\Login.cshtml
 
   <table>
 
      @using (@Html.BeginForm("Login", "Home"))
      {
 
         <tr>
            <td>Login :</td>
            <td>@Html.TextBox("Email")</td>
         </tr>
 
         <tr>
            <td>Password :</td>
            <td>@Html.Password("Password")</td>
         </tr>
 
         <tr>
            <td colspan="2">
               <input type="submit" name="Submit" value="Submit" />
            </td>
         </tr>
 
      }
 
   </table>
 
   \Library\SessionHelper.cs
 
   using System;
   using System.Web;
   using System.Web.SessionState;
 
   namespace CMS.Library
   {
      public static class SessionHelper
      {
         public static User GetUserInfo(this HttpSessionStateBase session)
         {
            return (session["LoginUser"] as User) ?? new User();
         }
 
         public static void SetUserInfo(this HttpSessionStateBase session, User user)
         {
            session["LoginUser"] = user;
         }
 
         public static User GetUserInfo(this System.Web.SessionState.HttpSessionState session)
         {
            return (session["LoginUser"] as User) ?? new User();
         }
 
         public static void SetUserInfo(this System.Web.SessionState.HttpSessionState session, User user)
         {
            session["LoginUser"] = user;
         }
      }
   }
 
   \Controller\HomeController.cs
 
   using System;
   using System.Linq;
   using System.Web.Security;
   using System.Web.Mvc;
   using CMS.Library;
 
   namespace CMS.Controllers
   {
      public class HomeController : Controller
      {
         public ActionResult Index()
         {
            return View();
         }
 
         [Authorize]
         public ActionResult About()
         {
            return View();
         }
 
         [Authorize]
         public ActionResult Contact()
         {
            return View();
         }
 
         public ActionResult Login()
         {
            return View();
         }
 
         [AllowAnonymous]
         [HttpPost]
         public ActionResult Login(FormCollection collection)
         {
               String Login = collection["Email"].ToString();
               String Passwd = collection["Password"].ToString();
 
               CMSEntities entity = new CMSEntities();
 
               User user = entity.Users.Where(u => u.Email == Login && u.Password == Passwd).SingleOrDefault();
 
            if (user != null)
            {
               FormsAuthentication.SetAuthCookie(Login, false);
               Session.SetUserInfo(user);
               return View("Index");
            }else{
               return View("Login");
            }
         }
 
         [Authorize]
         public ActionResult Logout()
         {
            FormsAuthentication.SignOut();
            Session.Clear();
            return View("Index");
         }
      }
   }