所以我目前正在使用登录中设置的ViewBag来确定他们是否只能看到管理员的东西。这样做是因为我们使用了ModelFirst ASP.net,因此禁用了Roles.CreateRole,Membership.CreateUser和Roles.AddUserToRole。
public ActionResult Login(LoginModel model, string returnUrl)
{
ViewBag.Admin = false;
if (model.IsValid(model.UserName, model.Password))
{
ViewBag.Admin = (bool)model.currentLoggedInEmployee.IsAdmin;
FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
return RedirectToAction("Index", "Home");
}
else
{
ModelState.AddModelError("", "Login data is incorrect!");
return View(model);
}
}
然后我们只使用:
@if (ViewBag.Admin == true) {
<li>@Html.ActionLink("Administration", "Index", "Administration")</li>
}
仅向管理员显示这些按钮。这很有效。
现在我们想要的是确保只有管理员可以运行某些功能,通过做一些类似于正常的事情
[Authenticate(Roles="Admin")]
[HttpPost]
public ActionResult Create(FormCollection collection)
{
// TODO: Add insert logic here
}
但是因为我们没有任何“角色”,所以我们不能这样做。我们需要使用ViewBag.Admin值来授权人们使用这些函数。问题是,如何做到这一点?
答案 0 :(得分:1)
我建议您自己滚动AuthorizeAttribute,然后从那里确定当前登录用户是否为管理员。
当您创建身份验证cookie时,请添加一些其他信息(例如admin标志),例如
public ActionResult Login(LoginModel model, string returnUrl)
{
if (model.IsValid(model.UserName, model.Password))
{
var ticket = new FormsAuthenticationTicket(1,
model.UserName,
DateTime.Now,
DateTime.Now.AddMinutes(30),
model.RememberMe,
model.currentLoggedInEmployee.IsAdmin, // user data
FormsAuthentication.FormsCookiePath);
// Encrypt the ticket.
string encTicket = FormsAuthentication.Encrypt(ticket);
// Create the cookie.
Response.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName, encTicket));
// Redirect back to original URL.
return RedirectToAction("Index", "Home");
}
else
{
ModelState.AddModelError("", "Login data is incorrect!");
return View(model);
}
}
创建自定义授权属性,以根据角色对登录用户进行身份验证,例如
public class AdminOnlyAttribute : AuthorizeAttribute
{
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
if (httpContext.Current.User.Identity.IsAuthenticated)
{
var ticket = ((FormsIdentity)User.Identity).Ticket;
return (bool)ticket.UserData;
}
else
{
return false;
}
}
}
然后将您的行动装饰为:
[AdminOnly]
[HttpPost]
public ActionResult Create(FormCollection collection)
{
// TODO: add insert logic here
}