[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
{
}
答案 0 :(得分:0)
如果您不想使用像MembershipProvider
和Identity
这样的ASP内置内容,最快的方法是创建自定义授权属性。有关详细信息,请查看this link或this 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
属性将使请求通过此设置传递给目标控制器操作。