27

我有一个内置的内部网络应用程序ASP.NET 4。我们坚持使用由另一个团队构建的身份验证 API。如果该站点的用户已成功通过该站点的身份验证,我想授予他们对整个站点的访问权限。

ASP.NETWebForm 时代,我只是用来在会话中保留一个自定义用户对象。如果该对象为空,我知道用户未通过身份验证。是否有类似但改进的方法MVC。如果可能,我不想构建自己的 ASP.NET 成员模型提供者。最简单的方法是什么?

4

5 回答 5

45

您可以Forms AuthenticationAuthorizeattibute 结合使用,如下所示,

限制对视图的访问:

在action方法声明中添加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");
}
于 2013-09-03T14:18:18.360 回答
5

您可能想要一个自定义授权过滤器。这是一个示例: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());
于 2013-09-03T14:10:16.523 回答
4

你可以尝试这样的事情:

FormsAuthentication.SetAuthCookie(username, rememberMe);

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

尝试在该主题上搜索更多信息,您会发现很多关于 MVC 中的身份验证和授权的内容。

于 2013-09-03T14:14:01.753 回答
1

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

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

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

于 2013-09-03T14:13:25.300 回答
-2

您可以通过在登录成功时简单地输入会话变量值来进行会话身份验证。例如

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>

我一直在我的应用程序管理面板中使用这种方法。

于 2015-06-20T12:44:49.130 回答