![](/img/trans.png)
[英]How to save details users visit pages to SQL in MVC 4 application?
[英]Allow user to visit [Authorize] pages - MVC
我的項目的頁面帶有[Authorize]
,用戶必須登錄才能訪問這些頁面。
使用與數據庫中相同的用戶名和密碼成功登錄后,當前用戶ID將存儲在會話中。 但是,我該如何驗證/允許用戶使用[授權]訪問頁面?
[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自己管理登錄名和安全性,則可以創建自己的操作過濾器,以檢查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
{
}
如果要控制用戶可以執行的操作,則應該具有自己的角色管理。 每個用戶應具有一個或多個角色,每個角色可以具有一組權限,並且您可以創建一個從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
{
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.