C#mvc5 - 检查用户是否在每个控制器方法中进行身份验证的简便方法

时间:2015-06-05 04:23:03

标签: c# asp.net-mvc-5

我有一个控制器,我只希望经过身份验证的用户能够访问。我是否必须检查控制器中的每个方法以验证用户是否已通过身份验证,或者是否有其他方法来处理此问题?我可以使用注释来代替吗?

来自我的控制器的示例:

public ActionResult Index()
        {
            if (UserVerified())
            {
               ...
            }
            return RedirectToAction("Login", "Account");
        }

    public ActionResult FacebookLogin()
    {
        if (UserVerified())
        {
           ....
        }

        return RedirectToAction("Login", "Account");
    }

    private bool UserVerified()
    {
        if (User != null && User.Identity != null && User.Identity.IsAuthenticated)
        {
            return true;
        }
        return false;
    }

6 个答案:

答案 0 :(得分:11)

您可以使用AuthorizeAttribute 把它放在每一个动作上。

[Authorize]
public ActionResult Index()
{
}

[Authorize]
public ActionResult FacebookLogin()
{
}

它将为您完成整个工作。它检查当前用户是否经过身份验证。如果他经过身份验证 - 继续执行操作,如果不是 - 返回主页。

您还可以将此属性添加到控制器。然后所有行动都需要授权。

[Authorize]
public class HomeController
{
    public ActionResult Index()
    {
    }

    public ActionResult FacebookLogin()
    {
    }
}

更新:而且,是的,正如卡米尔所说。请阅读这篇文章。
http://www.asp.net/web-api/overview/security/authentication-and-authorization-in-aspnet-web-api

您现在可以花一些时间,将来花费更少的时间来处理有关ASP.NET身份验证的问题。

顺便说一下,你不需要检查

User != null && User.Identity != null

如果您使用默认身份验证,则可以始终确保User.Identity是正确的对象。您可以直接访问User.Identity.IsAuthenticated

答案 1 :(得分:4)

使用Authorize属性是可行的方法(已在此处回答)。此外,如果您可能希望实现某些其他业务规则或筛选检查,则可以创建继承自AuthorizeAttribute的筛选器类。

e.g。

public class CustomAuthorizeFilter: AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {

        var isAuthorized = base.AuthorizeCore(httpContext);

        if (!isAuthorized)
        {
            return false; //User not Authorized
        }

        else
        {
             //Check your conditions here
        }
     }
} 

然后将您的控制器或操作装饰为:

[CustomAuthorizeFilter]
public class SomeController
{
}  

答案 2 :(得分:2)

您可以使用内置的用户[Authorize]属性。或者,您可以为相同的目的开发自定义属性。

您可以从这里开始为您自己的属性:

Create custom attribute

如果要对每个操作方法执行验证,请将该属性放在Controller级别而不是每个操作方法上。

答案 3 :(得分:1)

您可以在控制器方法之上使用[Authorize]属性。

请按照link

进行操作

答案 4 :(得分:1)

如果您希望将身份验证规则应用于所有控制器操作,您可以执行以下操作:

[someAuthAttribute]
public class HomeController : Controller
{
   // pseudo
    public ActionResult Index() {
       return response;
    }

    public ActionResult FacebookLogin(){
       return response;
    }

}

Index()和FacebookLogin()将遵守[someAuthAttribute]的身份验证规则。您还可以使用此“层次结构”将更具体的规则应用于您的操作方法。像这样:

[someAuthAttribute]
public class HomeController : Controller
{
   // pseudo
    public ActionResult Index() {
       return response;
    }

    [someFBAuthAttribute]
    public ActionResult FacebookLogin(){
       return response;
    }
} 

答案 5 :(得分:0)

您可以从基本控制器继承授权。

[Authorize(Roles = @"Domain\Group")]
public class BaseController : Controller

public class ChildController : BaseController