1

I have an MVC application, which has two areas - Administrator, and User. What I wanted to do, is on first login, the User will activate their account, agree to terms and conditions, etc. This application uses the asp membership api.

I have inserted an IF statement into the POST login action in the Account controller, however after debugging, it appears that this if statement is never executed. If someone could take a look at it I'd be very grateful. I have a feeling it could be something small I'm missing.

The login URL for the User is:

http://localhost:80/Account/LogOn?ReturnUrl=/User

The administrator URL is:

http://localhost:80/Account/LogOn?ReturnUrl=/Administrator

however both use the same login action in the account controller so hence the need to use an if statement to differentiate between the two.

Here is the code for the POST Logon action. The string returnUrl is "/User" not "User" which I discovered after debugging through the code.

 [HttpPost]
        public ActionResult LogOn(LogOnModel model, string returnUrl)
        {
            if (ModelState.IsValid)
            {
                if (MembershipService.ValidateUser(model.UserName, model.Password))
                {
                    FormsService.SignIn(model.UserName, model.RememberMe);
                    if (!String.IsNullOrEmpty(returnUrl))
                    {
                        return Redirect(returnUrl);
                    }
                    else
                    {
                        string url = returnUrl;

                        if (url == "/User")
                        {
                            ModelContainer ctn = new ModelContainer();

                            MyApp.Data.User p = ctn.Users.First(t => t.UserID == UserServices.CurrentUserId);

                            string status = p.AccountStatus;

                            if (status != "Active")
                            {
                                return RedirectToAction("contract", "Home");
                            }
                            else
                            {
                                return RedirectToAction("Index", "Home");
                            }
                        }
                        else
                            return RedirectToAction("Index", "Home");
                    }
                }
                else
                {
                    ModelState.AddModelError("", "The user name or password provided is incorrect.");
                }
            }

            // If we got this far, something failed, redisplay form
            return View(model);
        }

It just seems to skip after the else here:

if (!String.IsNullOrEmpty(returnUrl))
                    {
                        return Redirect(returnUrl);
                    }
                    else
                    {
                        string url = returnUrl;

and jumps right down to the final RedirectToAction.

I'd be very grateful if anyone could spot anything. If more info is needed just shout!

1
  • You may want to change your question title. Sounds like you broke the compiler. ;) Commented Dec 20, 2010 at 14:32

2 Answers 2

3

This will not go further than the if case when returnUrl == "/User" or any other value

if (!String.IsNullOrEmpty(returnUrl))
{
    return Redirect(returnUrl);
}

If not is null or empty, and if returnUrl == "/User", this is true since "/User" is not null and it is not empty.

and your second part will always be null or empty:

string url = returnUrl;

if (url == "/User")
{

so this will "appear" like something isn't working.

My suggestion would be to return the "true" case first in an if/ else for clarity:

if (string.IsNullOrEmpty(returnUrl))
{
    // do the default cases
}
else
{
    // redirect to returnUrl
}
Sign up to request clarification or add additional context in comments.

Comments

0

It doesn't - from your code, returnUrl will always contain a string, so it will run the first part of your conditional statement, and just return the redirect - it will never hit your first time user code.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.