【问题标题】:Authorization in MVCMVC 中的授权
【发布时间】:2015-04-22 12:58:59
【问题描述】:
[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))
                {
                }

上面的行使用我的用户名和密码进行身份验证,并返回真或假。

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

[Authorize]
public class ClaimsController : Controller
{}

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

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

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

[Authorize]
public class ClaimsController : Controller
{
}

【问题讨论】:

  • 问题是什么?
  • 即使用户身份验证返回 true,但是因为我已将 Authorize 属性赋予 Home 控制器,所以控件不会进入 Home Controller...我希望 Authorize 属性知道用户是真实的并让控制在里面,所以我可以打开主页...
  • 我是否正确理解了您的问题?我根据我的理解添加了一个答案,看看是否有帮助。

标签: asp.net-mvc authorization


【解决方案1】:

如果您不想使用像MembershipProviderIdentity 这样的ASP 内置的东西,最快的方法是创建一个自定义的授权属性。请查看this linkthis link 了解更多信息。

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

【讨论】:

    【解决方案2】:

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

        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
    {
    }
    

    【讨论】:

      【解决方案3】:

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

      你可以通过调用来做到这一点:

      FormsAuthentication.SetAuthCookie(username, rememberMe);
      

      上述调用将为给定的用户名创建一个身份验证票并将其附加到传出响应的 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 为真。 Authorize 属性将使请求通过此设置传递到目标控制器操作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-05
        • 2018-11-23
        • 2014-05-08
        相关资源
        最近更新 更多