将Identity与自定义属性一起使用

时间:2015-10-27 10:37:43

标签: c# asp.net asp.net-identity

我在webforms应用程序中使用Asp.Net Identity。我想要实现的是检查数据库中是否有用户IsActive如果是真的登录并且是否显示错误消息。如果我设置断点并检查IsActive值,那么它与数据库中的完全相同。 “我的数据库”列的数据类型为Bit。我遇到的问题是我无法向最终用户显示错误消息。我的代码在

之下
if (IsValid)
    {
        var manager = new UserManager();
        ApplicationUser user = manager.Find(UserName.Text, Password.Text);
        string userId = User.Identity.GetUserId();
        if (user != null && user.IsActive == true)
        {
            IdentityHelper.SignIn(manager, user, RememberMe.Checked);
            Response.Redirect("~/SecurePage.aspx"); //Redirect to a different page once user has logged in

            if(user.IsActive == false)
            {
                FailureText.Text = "Sorry you no longer have access"; //This error message never displays
                ErrorMessage.Visible = true;
            }
        }
        else
        {
            FailureText.Text = "Invalid username or password."; //This message displays even when user is not active
            ErrorMessage.Visible = true;
        }
    }

如果用户未处于活动状态,则他们无法登录哪些有效,但会显示错误的错误消息。我认为这可能是我的if逻辑。有人可以告诉我,我在哪里出错。

3 个答案:

答案 0 :(得分:1)

您的if(user.IsActive == false)检查无法访问,因为您在检查之前正在重定向用户。将此if子句移出父if-block:

    if (user != null && user.IsActive == true)
    {
        IdentityHelper.SignIn(manager, user, RememberMe.Checked);
        Response.Redirect("~/SecurePage.aspx"); //Redirect to a different page once user has logged in

    }
    else if(user != null && user.IsActive == false) 
    {
        FailureText.Text = "Sorry you no longer have access"; 
        ErrorMessage.Visible = true;
    }
    else
    {
        FailureText.Text = "Invalid username or password."; //This message displays even when user is not active
        ErrorMessage.Visible = true;
    }

答案 1 :(得分:1)

此代码的问题是语句if(user.IsActive == false)从不执行,因为第一个if语句仅在用户处于活动状态时才为真。您需要稍微调整一下代码才能使其正常工作。

if (user != null)
{
     if (user.IsActive)
     {
         IdentityHelper.SignIn(manager, user, RememberMe.Checked);
         Response.Redirect("~/SecurePage.aspx"); //Redirect to a different page once user has logged in
     }
     else
     {
         FailureText.Text = "Sorry you no longer have access"; //This error message never displays
         ErrorMessage.Visible = true;
     }
}

另请注意,我已将user.IsActive == true更改为user.IsActive。在bool语句条件下,以这种方式将if与true进行比较是多余的。

答案 2 :(得分:1)

Response.Redirect("~/SecurePage.aspx");将重定向到另一个页面,并且将终止当前页面的执行。因此Response.Redirect之后的代码不会被执行。

您可以将其移至else

if(user.IsActive == false)
{
    FailureText.Text = "Sorry you no longer have access"; //This error message never displays
    ErrorMessage.Visible = true;
}
else
    Response.Redirect("~/SecurePage.aspx"); //Redirect to a different page once user has logged in