MVC中的授权

时间:2015-04-21 12:36:23

标签: asp.net-mvc authorization

[HttpPost]
    public ActionResult Login(UserVM userVM)
    {         
       if (ModelState.IsValid || userVM.CheckWindowsAuth)
            {
                _userLF.UserName = userVM.UserName;
                _userLF.Password = userVM.Password;

                if (_userLF.AuthenticateUser(_userLF, userVM.CheckWindowsAuth))
                {
                }

以上行使用我的用户名和密码进行身份验证,并返回true或false。

我已将Authorize属性添加到所有其他控制器,如下所示:

[Authorize]
public class ClaimsController : Controller
{}

当我在Login方法中的下一行确认用户通过返回true成功验证时,我希望在其他控制器中覆盖[Authorize]。

if (_userLF.AuthenticateUser(_userLF, userVM.CheckWindowsAuth))
{
}

例如,即使用户身份验证返回true,下面的控制器也是如此,但由于我已将Authorize属性赋予Home控制器,因此控件不会进入Home Controller。我希望Authorize属性知道用户已经过身份验证,并且让请求成功映射到我在此控制器中的操作(因此我可以打开主页):

[Authorize]
public class ClaimsController : Controller
{
}

3 个答案:

答案 0 :(得分:0)

如果您不想使用像MembershipProviderIdentity这样的ASP内置内容,最快的方法是创建自定义授权属性。有关详细信息,请查看this linkthis link

要使您的自定义属性生效,它需要获取您在_userLF中的信息。这可以存储在会话中。因此,在Login方法您检查用户的信息并将其存储在会话中,此信息稍后由您的自定义授权属性使用,然后在注销时使用Session.Clear()清除此信息。您可以查看this answer以获取属性示例。

答案 1 :(得分:0)

您可以创建自己的授权属性。 像这样:

    public class MyAuthorizeAttribute : AuthorizeAttribute
    {
        public override bool Authorize()
        {
            //Your logic here    
            if (_userLF.AuthenticateUser(_userLF, userVM.CheckWindowsAuth))
            {
                return true;
            }
            else
            {
                return false;
            }
        }
    }

并在您的控制器中使用这个新创建的属性:

[MyAuthorizeAttribute]
public class ClaimsController : Controller
{
}

答案 2 :(得分:0)

如果我理解你的问题是正确的,我认为如果您在成功验证后使用FormsAuthentication,则需要设置Auth cookie。

您可以致电:

FormsAuthentication.SetAuthCookie(username, rememberMe);

以上调用将为给定的userName创建一个身份验证票证,并将其附加到传出响应的cookie集合中。

所以基本上你的代码如下所示:

    [HttpPost]
    public ActionResult Login(UserVM userVM, bool rememberMe = false)
    {
        if (ModelState.IsValid || userVM.CheckWindowsAuth)
        {
            _userLF.UserName = userVM.UserName;
            _userLF.Password = userVM.Password;

            if (_userLF.AuthenticateUser(_userLF, userVM.CheckWindowsAuth))
            {
                FormsAuthentication.SetAuthCookie(userVM.UserName, rememberMe);
            }
        }
    }

设置身份验证令牌后,它将在每个请求中发送,您将看到Request.IsAuthenticated为true。 Authorize属性将使请求通过此设置传递给目标控制器操作。