ASP.Net MVC 3 - 视图密码保护

4

Visual Studio 2010 - MVC 3

我有一个ASP.NET MVC应用程序的管理部分,我想要限制访问。该应用程序不会使用帐户,因此我将不会使用管理员角色或用户来授权访问。

我希望通过输入单个密码来访问该部分。这个部分将有多个操作。我设置了一个管理控制器,它重定向到多个不同的视图,所以基本上任何此控制器控制的视图都需要受到限制。

我还希望只需在一次会话中输入密码,因此当浏览器关闭并重新打开时,需要重新输入密码。

我该如何实现这一点?

2个回答

16

假设您有一个名为Protected的View文件夹(作为您的控制器),并且您有几个Action指向多个Views,我会这样做:

  • 使用Action过滤器装饰控制器/操作,例如:[SimpleMembership]
  • 在该Action过滤器中,仅检查Session变量的存在和内容
  • 如果不正确,则重定向到SignIn

代码如下:

public class SimpleMembershipAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        //redirect if not authenticated
        if (filterContext.HttpContext.Session["myApp-Authentication"] == null ||
            filterContext.HttpContext.Session["myApp-Authentication"] != "123")
        {
            //use the current url for the redirect
            string redirectOnSuccess = filterContext.HttpContext.Request.Url.AbsolutePath;

            //send them off to the login page
            string redirectUrl = string.Format("?ReturnUrl={0}", redirectOnSuccess);
            string loginUrl = "/Protected/SignIn" + redirectUrl;
            filterContext.HttpContext.Response.Redirect(loginUrl, true);
        }
    }
}

和你的控制器

public class ProtectedController : Controller
{
    [SimpleMembership]
    public ActionResult Index()
    {
        return View();
    }

    public ActionResult SignIn()
    {
        return View();
    }
    [HttpPost]
    public ActionResult SignIn(string pwd)
    {
        if (pwd == "123")
        {
            Session["myApp-Authentication"] = "123";
            return RedirectToAction("Index");
        }
        return View();
    }
}

如果你想要装饰整个控制器,你需要将SignIn方法移到外面来。要到达那里,你需要进行身份验证。


源代码:

你可以从http://cl.ly/JN6B下载简单的MVC3解决方案或者随意在GitHub上查看代码。


1

我会使用表单身份验证。 然后只需将[Authorize]属性添加到您想要限制的控制器或个别操作中。 然后,您需要一种登录方式等。 在这里查找有关表单身份验证的信息,希望能帮到您。

您始终可以创建自己的身份验证系统,在配置文件、数据库或其他地方保存用户名和密码。如果您不想涉及完整的表单身份验证,可以覆盖[Authorize]或创建自己的操作过滤器并对其进行处理。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接