我的项目获得了[Authorize]
页面,用户必须登录才能访问这些页面。
使用与数据库中相同的用户标识和密码成功登录后,当前用户标识将存储在会话中。但是我如何验证/允许用户使用[授权]访问页面?
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Login(User u)
{
if (ModelState.IsValid) //this is check validity
{
using (UserEntities db = new UserEntities())
{
var v = db.Users.Where(a=>a.UserName.Equals(u.UserName) && a.Password.Equals(u.Password)).FirstOrDefault();
if (v != null)
{
Session["LoggedUserID"] = u.Id.ToString();
Session["UserFullname"] = u.Name.ToString();
return RedirectToAction("AfterLogin");
}
}
}
return View(u);
}
任何帮助都非常感谢。感谢。
答案 0 :(得分:4)
如果您绝对想要使用Session自己管理登录和安全性,您可以创建自己的操作过滤器,检查会话是否设置了用户ID。
像这样的东西
public class AuthorizeWithSession : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext context)
{
if (context.HttpContext.Session == null ||
context.HttpContext.Session["LoggedUserID"]==null)
{
context.Result =
new RedirectToRouteResult(new RouteValueDictionary(
new {controller = "Account", action = "Login"}));
}
base.OnActionExecuting(context);
}
}
现在在您的安全操作/控制器上装饰此操作过滤器
[AuthorizeWithSession]
public class TeamController : Controller
{
}
答案 1 :(得分:1)
如果要控制用户可以执行的操作,则应该拥有自己的角色管理。 每个用户都应该有一个或多个角色,每个角色都可以拥有一组权限,您可以创建一个从AuthorizeAttribute继承的动作过滤器,以确保它尽早执行。
在AuthorizeAttribute的AuthorizeCore方法中,您将看到用户是否经过身份验证,如果他已经过身份验证,那么您可以读取他的身份,从数据库中读取他的角色和权限,并将其与传递给的值进行比较角色。
例如:
public class RequireRoleAttribute : AuthorizeAttribute
{
public RoleEnum[] RequiredRoles { get; set; }
public RequireRoleAttribute()
{
}
public RequireRoleAttribute(params RoleEnum[] roles)
: this()
{
RequiredRoles = roles;
}
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
var principle = httpContext.User;
if (principle == null || principle.Identity == null || !principle.Identity.IsAuthenticated)
{
return false;
}
if (RequiredRoles != null)
{
if (!HasRole(RequiredRoles))
{
httpContext.Response.Redirect("/AccessDenied");
}
}
return base.AuthorizeCore(httpContext);
}
public bool HasRole(RoleEnum[] roles)
{
foreach (var role in roles)
{
if (HasRole(role))
return true;
}
return false;
}
public bool HasRole(RoleEnum role)
{
return true if the user role has the role specified (read it from database for example)
}
}
然后在您的控制器中,只需使用属性
注释控制器或操作 [RequireRole(RoleEnum.Administator)]
public class MySecureController : Controller
{
}