C#.NET使用isAuthenticated

我使用MVC格式来创建一个网站。 现在它所做的只是从SQL服务器管理用户。 我现在要做的是让用户登录然后能够管理用户。 从登录页面,它应该转到帐户的索引,但我只希望经过身份validation的用户可以查看此页面。 如果我:它工作正常:

1)将控制器中的函数设置为[AllowAnonymous](这不是我想要的)

2)允许Windows身份validation(这不是我想要的,因为一旦我部署,它将在网络上)

它实际上只是归结为如何validation用户,然后保持该身份validation。

这是登录页面:

@model myWebsite.Models.LoginModel @{ ViewBag.Title = "Login"; ViewBag.ReturnUrl = "Index"; } 

Login

@using (Html.BeginForm("Login", "Login", new { ReturnUrl = ViewBag.ReturnUrl }, FormMethod.Post, new { @class = "form-horizontal", role = "form" })) { @Html.AntiForgeryToken()

Login


@Html.ValidationSummary(true, "", new { @class = "text-danger"})
@Html.LabelFor(Model => Model.UserName, new { @class = "control-label col-md-2"})
@Html.TextBoxFor(Model => Model.UserName, new { @class = "col-md-2 control-label"}) @Html.ValidationMessageFor(Model => Model.UserName, "" , new { @class = "text-danger"})
@Html.LabelFor(Model => Model.Password, new { @class = "control-label col-md-2"})
@Html.TextBoxFor(Model => Model.Password, new { @class = "col-md-2 control-label"}) @Html.ValidationMessageFor(Model => Model.Password, "" , new { @class = "text-danger"})
}

这是每个页面的部分部分

 @using Microsoft.AspNet.Identity; @if (Request.IsAuthenticated) { using (Html.BeginForm("LogOff", "Account", FormMethod.Post, new { id = "logoutForm", @class = "navbar-right" })) { @Html.AntiForgeryToken()  } } else {  } 

这是控制器

  [AllowAnonymous] // GET: Login public ActionResult Login() { return View(); } [AllowAnonymous] // GET: Login public ActionResult Login() { return View(); } [HttpPost] [AllowAnonymous] [ValidateAntiForgeryToken] public ActionResult Login(LoginModel model, string retunUrl) { /* if (!ModelState.IsValid) { Console.WriteLine("IS NOT VALID"); return View(model); } */ String UserName = model.UserName; String Password = model.Password; LoginContext LC = new LoginContext(); LoginModel ValidUser = LC.UserList.Single(Person => Person.UserName == UserName && Person.Password == Password); if (ValidUser != null) { return Redirect("Index"); } return View(model); } // GET: Login Index of users [AllowAnonymous] public ActionResult Index() { return View(db.UserList.ToList()); } 

The Old Way™

如果您只关心用户为您提供有效凭据的事实,那么您最简单的选项可能是FormsAuthentication:

 FormsAuthentication.SetAuthCookie(model.UserName, false); 

 FormsAuthentication.SignOut(); 

这些要求FormsAuthentication模块处于活动状态,因此您可以在web.config中查找这样的行:

  

并删除它,并添加或更新身份validation部分:

    

通过这些设置,ASP.NET知道从FormsAuthentication.SetAuthCookie生成的cookie中构建Identity和Principle。

Right(ish)Way™

话虽这么说,FormsAuthentication在这一点上并不是推荐的路径,因为它依赖于System.Web,而且它不是声明感知的事实。

您可以使用确实产生声明感知身份的OWIN来完成最小设置。 如果您使用较新的ASP.NET项目模板,那么您应该在App_Start文件夹中有一个Startup.Auth.cs文件,或者您可以添加一个。 使用OWIN进行基于cookie的身份validation的最小代码是:

 using Microsoft.AspNet.Identity; using Microsoft.Owin; using Microsoft.Owin.Security; using Microsoft.Owin.Security.Cookies; using Owin; public partial class Startup { public void ConfigureAuth(IAppBuilder app) { app.UseCookieAuthentication(new CookieAuthenticationOptions { LoginPath = new PathString("/account/login"), LogoutPath = new PathString("/account/logout"), CookieName = ".YOUR_COOKIE_NAME_HERE", SlidingExpiration = true, AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, AuthenticationMode = AuthenticationMode.Active }); } } 

然后,当您对用户进行身份validation时,您会执行以下操作:

 var claims = new List(); claims.Add(new Claim(ClaimTypes.Name, model.UserName)); var identity = new ClaimsIdentity(claims, DefaultAuthenticationTypes.ApplicationCookie); HttpContext.Current.Request.GetOwinContext().Authentication.SignIn(identity); 

并退出:

 HttpContext.Current.Request.GetOwinContext().Authentication.SignOut(DefaultAuthenticationTypes.ApplicationCookie); 

您还需要在Global.asax文件中设置以下值:

 using System.Web.Helpers; using System.Security.Claims; public class MvcApplication : System.Web.HttpApplication { protected void Application_Start() { // ... your other startup/registration code ... AntiForgeryConfig.UniqueClaimTypeIdentifier = ClaimTypes.Name; } } 

Request.IsAuthenticated只检查当前请求上下文中是否已建立非匿名身份,因此上述任一选项都可以。

暂且不说: 你真的不应该用纯文本存储密码。 创建用户记录时,使用Crypto.HashPassword创建密码的盐渍哈希值,然后存储密码,然后在检查用户是否输入正确的密码时使用Crypto.VerifyHashedPassword 。 您可以在此处找到加密文档 。