如何在ASP.net MVC中限制对控制器中某些操作的访问

Cod*_*ior 5 authentication asp.net-mvc filter

我是ASP.net MVC的新手,并使用它创建了我的第一个Web应用程序.在我的应用程序中我使用数据库身份验证 我在控制器中创建了Login操作,检查输入的用户名和密码是否存在于DB中,如果存在,则在Session中输入所需的值,并根据权限将用户重定向到页面,将用户重定向到登录页面.像这样

public ActionResult Login()
{
   if(uservalid)
   {
      //set session values and redirect to dashboard
   }
   else
   {
      //redirect to login
   }
}
Run Code Online (Sandbox Code Playgroud)

在我的应用程序中,有一些功能只能在用户登录时访问.我想在用户尝试访问这些功能之前检查用户是否登录,如果他没有登录或没有权限,则重定向到登录页面或显示一些错误消息.

public ActionResult SomeAction()
{
   //Available only when user is logged-in
}
Run Code Online (Sandbox Code Playgroud)

那么我该如何检查用户是否登录并提供操作访问权限.我读了有关Authorize属性但不知道如何使用它,因为我正在使用数据库身份验证.

Mur*_*san 5

我申请[Authorize]以及我自己的自定义属性来限制基于许可的操作。代码如下

 [Authorize]
 [FeatureAuthentication(AllowFeature=FeatureConst.ShowDashboard)]
 public ActionResult Index()
    {

    }
Run Code Online (Sandbox Code Playgroud)

过滤器代码

public class FeatureAuthenticationAttribute : FilterAttribute, IAuthorizationFilter
 {
    public FeatureConst AllowFeature { get; set; }

    public void OnAuthorization(AuthorizationContext filterContext)
    {
        //var featureConst = (FeatureConst)filterContext.RouteData.Values["AllowFeature"];

        var filterAttribute = filterContext.ActionDescriptor.GetFilterAttributes(true)
                                .Where(a => a.GetType() == typeof(FeatureAuthenticationAttribute));
        if (filterAttribute != null)
        {
            foreach (FeatureAuthenticationAttribute attr in filterAttribute)
            {
                AllowFeature = attr.AllowFeature;
            }

            User currentLoggedInUser = (User)filterContext.HttpContext.Session["CurrentUser"];
            bool allowed = ACLAccessHelper.IsAccessible(AllowFeature.ToString(), currentLoggedInUser);
            // do your logic...
            if (!allowed)
            {
                string unAuthorizedUrl = new UrlHelper(filterContext.RequestContext).RouteUrl(new { controller = "home", action = "UnAuthorized" });
                filterContext.HttpContext.Response.Redirect(unAuthorizedUrl);
            }
        }
    }
 }
Run Code Online (Sandbox Code Playgroud)


Dar*_*rov 5

如果您正在使用FormsAuthentication,则不需要使用 ASP.NET 会话来跟踪当前经过身份验证的用户。

我阅读了 Authorize 属性,但不知道如何使用它,因为我正在使用数据库身份验证。

假设您使用 FormsAuthentication,一旦您验证了用户的凭据,您应该设置一个表单身份验证 cookie:

public ActionResult Login()
{
   if(uservalid)
   {
      FormsAuthentication.SetAuthCookie("username", false);
      return RedirectToAction("SomeProtectedAction");
   }
   else
   {
      //redirect to login
   }
}
Run Code Online (Sandbox Code Playgroud)

进而:

[Authorize]
public ActionResult SomeAction()
{
   string currentlyLoggedInUser = User.Identity.Name;
}
Run Code Online (Sandbox Code Playgroud)

顺便说一下,如果您使用 Visual Studio 中的 Internet 模板创建一个新的 ASP.NET MVC 应用程序,您可以查看 AccountController,它负责对用户进行身份验证并设置表单身份验证 cookie。当然,您可以将所有实体框架的废话都扔掉,并针对您自己的数据库表实施您自己的凭据验证。