当我在mvc中实现roleprovider时,此网页有一个重定向循环

时间:2014-12-05 09:21:54

标签: asp.net asp.net-mvc asp.net-mvc-4

我正在使用asp.net开发一个MVC网站。我尝试实现一个custom role provider,您可以看到我在下面实现:

namespace PaperlessUI.Helper
{
    public class CustomRoleProvider : RoleProvider 
    {

        public override string[] GetRolesForUser(string email)
        {

            Repository.UserRepository objUserRepository = new Repository.UserRepository();
            return objUserRepository.ReturnRole(email);

        }

        public override string[] GetUsersInRole(string email)
        {
            Repository.UserRepository objUserRepository = new Repository.UserRepository();
            return objUserRepository.ReturnRole(email);
        }

        public override void RemoveUsersFromRoles(string[] usernames, string[] roleNames)
        {
            throw new NotImplementedException();
        }
    }
}

返回权限的代码是:

   public long ReturnUserIdByEmail(string email)
        {
            return FindBy(i => i.Email == email).First().Id;
        }

        public string[] ReturnRole(string email)
        {
            var objUser = FindBy(x => x.Email == email).First();
            string[] ret = new string[1];
            if (objUser == null)
            {
                return null;
            }
            ret[0] = objUser.Permission;
            return ret;
        } 

我在webconfig添加了一段代码,如您所见:

<roleManager enabled="true" defaultProvider="CustomRoleProvider">
      <providers>
        <add name="CustomRoleProvider" type="PaperlessUI.Helper.CustomRoleProvider" />
      </providers>
    </roleManager>

在我的控制器中,我可以使用角色调用授权,如您所见:

[Authorize(Roles = "user")]

    public class LetterController : Controller
    {
    }

但是当我打电话给我的控制器时我得到了这个错误:

This webpage has a redirect loop

我呼叫的url是localhost / user / letter / inbox

但它改为

http://localhost:3178/Login/Login?ReturnUrl=%2fuser%2fletter%2finbox

并出现错误:

This webpage has a redirect loop

我在控制器的第一行放了一个断点,但它没有涉及?!

另一件事是我的应用程序useradmin

中有两个区域

我在这里放了一个断点:

Repository.UserRepository objUserRepository = new Repository.UserRepository();
                return objUserRepository.ReturnRole(email);

这里循环正在发生,但为什么?

这是我的登录控制器:

public class LoginController : Controller
    {
        //
        // GET: /Login/
        UserRepository objUserRepository = new UserRepository();

        [HttpGet]
        public ActionResult Login(string returnUrl)
        {
            if (User.Identity.IsAuthenticated) //remember me
            {
                if (shouldRedirect(returnUrl))
                {
                    return Redirect(returnUrl);
                }

                if (User.IsInRole("admin"))
                {
                    return RedirectToAction("Index","Home",new {Area = "Admin"});
                }
                else if (User.IsInRole("user"))
                {
                    return RedirectToAction("Index", "Home", new { Area = "User" });
                }

            }
            return View(); // show the login page
        }

        [HttpPost]
        public ActionResult Login(User loginInfo, string returnUrl)
        {
            ModelState.Remove("FullName");
            ModelState.Remove("InternationalCode");
            ModelState.Remove("Phone");
            ModelState.Remove("Mobile");
            ModelState.Remove("Fax");
            ModelState.Remove("Post");
            ModelState.Remove("Part");
            ModelState.Remove("Organization");
            ModelState.Remove("Permission");
            ModelState.Remove("Enable");
            ModelState.Remove("Date");
            ModelState.Remove("Enable");

            if (this.ModelState.IsValid)
            {

                if (objUserRepository.FindBy(i => i.Email == loginInfo.Email & i.Password == loginInfo.Password).Any())
                {
                    User objUser = objUserRepository.FindBy(i => i.Email == loginInfo.Email & i.Password == loginInfo.Password).FirstOrDefault();

                    FormsAuthentication.SetAuthCookie(loginInfo.Email, loginInfo.RememberMe);
                    if (shouldRedirect(returnUrl))
                    {
                        return Redirect(returnUrl);
                    }

                    if (objUser.Permission == "user")
                    {
                        return RedirectToAction("Index", "Home", new {Area = "User"});
                    }
                    else if (objUser.Permission == "admin")
                    {
                        return RedirectToAction("Index", "Home", new { Area = "Admin" });
                    }
                    //FormsAuthentication.RedirectFromLoginPage(loginInfo.FullName,loginInfo.RememberMe);
                }
            }
            this.ModelState.AddModelError("", "ایمیل یا رمز عبور نادرست می باشد. لطفا مجددا امتحان نمایید.");
            ViewBag.Error = "ایمیل یا رمز عبور نادرست می باشد. لطفا مجددا امتحان نمایید.";
            return View(loginInfo);
        }

        [HttpGet]
        public ActionResult LogOut()
        {
            FormsAuthentication.SignOut();
            return RedirectToAction("Login", "Login",new {Area = ""});
        }

        private bool shouldRedirect(string returnUrl)
        {
            // it's a security check
            return !string.IsNullOrWhiteSpace(returnUrl) &&
            Url.IsLocalUrl(returnUrl) &&
            returnUrl.Length > 1 &&
            returnUrl.StartsWith("/") &&
            !returnUrl.StartsWith("//") &&
            !returnUrl.StartsWith("/\\");
        }

    }

信函控制人:

 [Authorize(Roles = "user")]

    public class LetterController : Controller
    {
        LetterRepository objLetterRepository = new LetterRepository();
        ReceiverRepository objReceiverRepository = new ReceiverRepository();
        AttachmentRepository objAttachmentRepository = new AttachmentRepository();
        //
        // GET: /User/Letter/

        public ActionResult Inbox(string searchLetter)
        {
            //بطور پیش فرض کاربر اول از لیست حذف می شود که بایداصلاح گردد
            int userId = 1;

            List<Letter> lstLetters = new List<Letter>();
            lstLetters = objReceiverRepository.FindBy(i => i.ReceiverId == userId).Select(i => i.Letter).ToList();

            if (searchLetter != null)
            {
                lstLetters = objReceiverRepository.FindBy(i => i.ReceiverId == userId).Where(i=>i.Letter.Subject.Contains(searchLetter)).Select(i=>i.Letter).ToList();
                ViewBag.searchOff = true;
            }

            return View(lstLetters);
        }

        [HttpPost]
        public ActionResult Inbox()
        {
            string sbj = Request["searchLetter"].Trim();
            return RedirectToAction("Inbox", new {searchLetter = sbj});
        }

}

0 个答案:

没有答案