我正在使用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
我在控制器的第一行放了一个断点,但它没有涉及?!
另一件事是我的应用程序user
和admin
我在这里放了一个断点:
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});
}
}