首页 文章

自定义身份验证和ASP.NET MVC

提问于
浏览
27

我在 ASP.NET 4 内置了一个内部Web应用程序 . 我们很难使用其他团队构建的身份验证API . 如果该站点的用户已成功通过该站点的身份验证,我希望他们可以访问整个站点 .

ASP.NET WebForm时代,我只是习惯在会话中保留自定义User对象 . 如果该对象为null,我知道用户未经过身份验证 . 在 MVC 中是否有类似但改进的方法 . 如果可能的话,我不想构建自己的ASP.NET Membership模型提供程序 . 这样做最简单的方法是什么?

5 回答

  • 1

    您可以将 Forms AuthenticationAuthorize attibute结合使用,如下所示,

    要限制对视图的访问:

    将AuthorizeAttribute属性添加到操作方法声明中,如下所示,

    [Authorize]
    public ActionResult Index()
    {
        return View();
    }
    

    在web.config中配置表单身份验证

    <authentication mode="Forms">
         <forms loginUrl="~/Account/Login" timeout="2880" />
    </authentication>
    

    登录发布操作:如果用户有效,则设置身份验证cookie

    [HttpPost]
    public ActionResult Login(User model, string returnUrl)
    {
            //Validation code
    
            if (userValid)
            {
                 FormsAuthentication.SetAuthCookie(username, false);
            }
    }
    

    注销动作:

    public ActionResult LogOff()
    {
        FormsAuthentication.SignOut();
        return RedirectToAction("Index", "Home");
    }
    
  • 43

    您可能想要自定义authorization filter . 这是一个例子:Custom filters in MVC . 然后,您可以在应用启动时全局应用此过滤器(使用 RegisterGlobalFilters ) .

    public class LegacyAuthorize : AuthorizeAttribute
    {
      public override void OnAuthorization(HttpActionContext actionContext)
      {
        if (HttpContext.Current.Session["User"] == null)
          base.HandleUnauthorizedRequest(actionContext);
      }
    }
    

    然后在你的 global.asax 你会有这样的事情:

    GlobalFilters.Filters.Add(new LegacyAuthorize());
    
  • 3

    你可以尝试这样的事情:

    FormsAuthentication.SetAuthCookie(username, rememberMe);
    

    要为经过身份验证的用户设置cookie,然后只需使用Controller或需要身份验证的Action上的 [Authorize] 属性 .

    尝试使用Google搜索该主题以获取更多信息,您将在MVC中找到许多关于身份验证和授权的内容 .

  • -2

    您可以在MVC中执行的表单中执行的所有操作,只需在控制器登录操作中设置会话变量即可 .

    或者你可以这样做:在登录操作中添加 formsauthentication.setauthcookie("username")

    在此之后,使用[Authorize]关键字的任何操作都将允许当前用户进入 .

  • 5

    您可以通过在登录成功时简单地放置会话变量值来执行会话身份验证 . 例如

    public ActionResult Index(Models.Login login)
        {
            if (ModelState.IsValid)
            {
                Dal.Login dLogin = new Dal.Login();
                string result = dLogin.LoginUser(login);
                if (result == "Success")
                    Session["AuthState"] = "Authenticated";
            }
            return View();
        }
    

    现在的诀窍是,您应该拥有所有视图的公共布局页面,您必须检查它们的身份验证 . 在这个布局页面只需要像这样做一个剃刀检查 -

    <body>
        @if (Session["AuthState"] != "Authenticated")
        {
            Response.Redirect("~/login");
        }
        // other html
    </body>
    

    我一直在我的应用程序管理面板中使用此方法 .

相关问题