允许用户访问[Authorize]页面 - MVC
我的项目获得页面[Authorize]
,用户必须登录才能访问这些页面。允许用户访问[Authorize]页面 - MVC
如果在数据库中使用相同的用户标识和密码成功登录,当前用户标识将存储在会话中。但我该如何进行身份验证/允许用户使用[授权]访问页面?
[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);
}
任何帮助是非常感谢。谢谢。
如果您绝对想使用Session自己管理登录和安全性,您可以创建自己的操作筛选器,检查会话是否设置了用户标识。
像这样的事情
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
{
}
你应该有你自己的角色管理,如果你想控制哪些用户可以做。 每个用户都应该有一个或多个角色,每个角色可以拥有一组权限,并且您可以创建一个从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
{
}
感谢您的启发。 'RoleEnum []'不能解决,我该如何处理? – skylake
RoleEnum []只是一个包含您的角色列表的枚举,例如:Customer,Administrator,User。 ' 公共枚举RoleEnum { 管理员, 客户 } –
啊感谢,但我应该在哪里把这个类在MVC?我很新,所有这些排序仍然令人困惑。 – skylake
TryGetValue有问题,因为我得到以下错误 - ..'由于其保护级别而无法访问。无法解析符号TryGetValue'.'不知道如何解决这个问题。 – skylake
啊!该代码是针对aspnet核心的。对于其他版本的MVC,您可以对该密钥执行空值检查(答案已更新)。你可以把这个班放在你的项目的任何地方。我更喜欢创建一个名为“Filters”的目录并将所有过滤器放在该过滤器下。 – Shyju