首先,您必须为您的扩展角色管理创建额外的表,例如projects,并在operations 的上下文中与users 建立关系,这可能是您的controller's actions。
一种方法是为roles 创建自己的表。在这种情况下,您将只使用 Asp net membership users,但这完全取决于您的要求。
其次,您必须在MVC 中处理它,我认为最好的方法是通过您自己的自定义Authorization 属性来实现它,并使用您的自定义授权属性而不是[Authorization] 属性来装饰控制器的操作。
很简单。
[CustomAuthorize]
//[Authorize]
public ActionResult GetProjectTasks(string projectname)
{
}
为此,您必须从FilterAttribute 继承您的类,并且还必须实现IAuthorizationFilter 接口。
public void OnAuthorization(AuthorizationContext filterContext)
{
HttpCookie authCookie = filterContext.HttpContext.Request.Cookies[FormsAuthentication.FormsCookieName];
if (authCookie != null)
{
FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value);
var identity = new GenericIdentity(authTicket.Name, "Forms");
var principal = new GenericPrincipal(identity, new string[] { authTicket.UserData });
filterContext.HttpContext.User = principal;
}
var controller = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName;
var action = filterContext.ActionDescriptor.ActionName;
var user = filterContext.HttpContext.User;
var ip = filterContext.HttpContext.Request.UserHostAddress;
var isAccessAllowed = CustomAuthenticationLogic.IsAccessAllowed(controller, action, user, ip);
if (!isAccessAllowed)
{
// Code if user is authenticated
FormsAuthentication.RedirectToLoginPage();
}
}
在OnAuthorization 方法中,您可以获得自定义授权逻辑中可能需要的所有信息,例如HttpContext、Controller 名称、Action 名称。您只需从此方法调用您的自定义身份验证逻辑。
您的自定义身份验证逻辑可能如下所示。
public class CustomAuthenticationLogic
{
public static bool IsAccessAllowed(string controller, string action, IPrincipal user, string ip)
{
//
// Your custom logic here
//
}
}