1

我正在尝试让 FormsAuthentication 与我的 Razor 应用程序(MVC 3)一起使用。我有一个 LoginController 调用我的 LoginPage(在 Views/Shared 中);我的 web.config 将 LoginUrl 设置为“/Login/”。当应用程序尝试调出主页时,[Authorize] 行会正确调出 LoginPage,但这就是问题的开始。

这是我的 LoginController.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace ABMCEditAndReports.Controllers
{
    public class LoginController : Controller
    {
        //
        // GET: /Login/

        public ActionResult Index()
        {
            return View("LoginPage");
        }

    }
}

这是我的 LoginPage.cshtml:

@{
    ViewBag.Title = "Login Page";
    ViewBag.Header = "Login Page";
}

<script type="text/javascript">
    $.ajaxSetup({ cache: false });

    function onClickLogin() {       
        if (Membership.ValidateUser(txtUsername.Text, txtPassword.Text)) {
           FormsAuthentication.RedirectFromLoginPage(txtUsername.Text, false);
        }
        else {
           lblErrorMessage.Text = "This works better if you use YOUR user name and password";
        }
    }
</script>

<div style="text-align:center;">
<h2>Login Required</h2>
User Name:
<input type="text" name="txtUsername" />
<br />
Password:
<input type="password" name="txtPassword" />
<br />
<input type="button" id="btnLogin" value="Login" onclick="onClickLogin()" />
<br />
<label id="lblErrorMessage" style="color:Red"></label>
</div>

第一个问题是,当我启动应用程序时,VS 停止在 $.ajaxSetup 行并显示“Microsoft JScript 运行时错误:'$' 未定义”。

当我将其注释掉时,页面会显示出来,但是当我按下“登录”按钮时,它会在 Membership.ValidateUser 行停止,并显示“Microsoft JScript 运行时错误:'Membership' 未定义”。

请注意,$.ajaxSetup 行在我的所有其他视图页面上都可以正常工作。

我尝试将“@using System.Web.Security”添加到 LoginPage.cshtml,并将命名空间 System.Web.Security 添加到 web.config(主要的和 /Views 中的);没有什么可以解决的。

我会以正确的方式解决这个问题吗?我应该在 .cs 文件中调用 ValidateUser 吗?如果是这样,我如何调用 RedirectFromLoginPage?(为什么它不接受 $.ajaxSetup?)

4

1 回答 1

2

FormsAuthentication确实适用于 ASP.NET MVC,但请尝试在服务器上进行身份验证。这是一个例子:

控制器:

namespace ABMCEditAndReports.Controllers
{
    public class LoginController : Controller
    {
        //
        // GET: /Login/

        public ActionResult Index(string returnUrl = null)
        {
            this.ViewBag.ReturnUrl = returnUrl;
            return View("LoginPage");
        }

        public ActionResult Index(LogInViewModel model, string returnUrl)
        {
            if (this.ModelState.IsValid && Membership.ValidateUser(model.UserName, model.Password))
            {
                FormsAuthentication.SetAuthCookie(model.UserName, false);
                return this.Redirect(returnUrl);
            }

            this.ModelState.AddModelError("", "The user name or password provided is incorrect.");
            return this.View(model);
        }
    }
}

模型:

namespace ABMCEditAndReports.Models
{
    public class LogInViewModel
    {
        [Display(Name = "User Name")]
        public string UserName { get; set; }

        [Display(Name = "Password")]
        [DataType(DataType.Password)]
        public string Password { get; set; }
    }
}

看法:

@model ABMCEditAndReports.Models.LogInViewModel
@using (Html.BeginForm(new { ReturnUrl = ViewBag.ReturnUrl }))
{
    @Html.ValidationSummary()
    <h2>Please sign in</h2>
    <div>
      @Html.DisplayNameFor(model => model.UserName)
      @Html.EditorFor(model => model.UserName)
    </div>
    <div>
      @Html.DisplayNameFor(model => model.Password)
      @Html.EditorFor(model => model.Password)
    </div>
    <button type="submit">Sign in</button>
}
于 2013-09-30T16:43:02.027 回答