kap*_*il 11 c# user-roles asp.net-mvc-3
我想为应用程序添加一项功能,以便只有管理员才能创建用户,并且他可以向用户提供对特定页面的访问权限.
他可以创建角色并为用户提供不同的角色.
我正在使用Visual Studio 2010并在MVC3中构建此应用程序.
请给我一些建议.
提前致谢.
Evg*_*vin 13
1.使用Authorize属性(通知,使用AuthorizeAttribute的Roles属性需要实现MembershipProvider(标准或自定义)并在web.config中注册)来展示您的用户创建和权限设置操作
public class AccountController : Controller
{
[HttpGet, Authorize(Roles = "Admin")]
public ViewResult CreateUser()
{
return View();
}
[HttpPost, Authorize(Roles = "Admin")]
public ActionResult CreateUser()
{
//... call service method to create user
}
[HttpPost, Authorize(Roles = "Admin")]
public ActionResult AssignPageToUser(int userId, string controllerName, string ActionName)
{
//... insert record into table (UserPermissions) with attributes (userId, actionName, controllerName)
}
// other methods without decoration by authorize attribute
}
Run Code Online (Sandbox Code Playgroud)
如果您真的想要为每个用户单独完全控制操作权限,则下一段是正确的.如果您认为,您的权限可以在角色[Authorize("Customer, Manager, RegionalAdmin")]上分配有限数量和小数量 - 您可以通过授权属性装饰所有操作/控制器并指定角色,可用的操作/控制器:并为管理员提供将角色分配给用户的可能性.但请记住,只有在列出的角色中只有1个才能获得访问权限,您不能要求此属性,例如Admin和Manager角色.如果您想要需要多于1个角色,请使用多个属性:
public class MyController:Controller
{
[Authorize(Roles = "Manager")]
[Authorize(Roles = "Admin")]
public ActionResult Action1()
{
//...
}
}
Run Code Online (Sandbox Code Playgroud)
2.对于您的页面,您可以创建自己的过滤器属性,继承自authorize属性,该属性将检查操作是否可供用户使用(我认为您要为用户分配操作而不是视图).
public UserPermissionRequiredAttribute: AuthorizeAttribute
{
public OnAuthorization(AuthorizationContext filterContext)
{
var isAuthenticated = filterContext.HttpContext.User.Identity.IsAuthenticated;
var userName = filterContext.HttpContext.User.Identity.Name;
var actionName = filterContext.ActionDescriptior.ActionName;
var controllerName = filterContext.ActionDescriptior.ControllerDescriptor.ControllerName;
if (isAuthenticated && myUserActionPermissionsService.UserCanAccessAction(userName, actionName, contollerName)
{
filterContext.Result = HttpUnauthorizedResult(); // aborts action executing
}
}
}
Run Code Online (Sandbox Code Playgroud)
3.Decrate动作(控制器),可供管理员授予的用户访问:
MySpecialController: Controller
{
[UserPermissionRequired]
Action1()
{
//...
}
[UserPermissionRequired]
Action2()
{
//...
}
Action3()
{
//...
}
Run Code Online (Sandbox Code Playgroud)
}
我不建议为此目的使用基本控制器,因为属性使用更灵活(您可以控制操作/控制器级别而不是仅控制器级别),这是实现分离责任的更好方法.基本控制器和过滤器属性用法关联为多态和切换运算符.
您问的问题非常广泛,需要一些时间来审查您的所有要求。在任何情况下,您都可以首先向所有其他控制器继承的控制器添加用户属性。然后,您可以询问该用户实例以确定他们是否有权访问当前路由。该解决方案应该为您提供添加一些管理视图以满足您的业务需求所需的基础。
public class MegaController
{
protected User CurrentUser { get; set; }
protected override void Initialize(RequestContext context)
{
if (requestContext.HttpContext.User.Identity.IsAuthenticated)
{
var userRepository = new UserRepository();
CurrentUser = userRepository.GetUser(
requestContext.HttpContext.User.Identity.Name);
}
}
}
Run Code Online (Sandbox Code Playgroud)
和类型可以是您自己的设计User。UserRepository您可以使用 LINQ To Entities 包装名为“User”的表,然后在控制器中,您可以访问该表中的任何字段。
然后,将所有控制器子类化MegaController
public class AdminController : MegaController
{
public ActionResult Action1()
{
return View();
}
}
public class SomeOtherController : MegaController
{
public ActionResult Action1()
{
return View();
}
}
Run Code Online (Sandbox Code Playgroud)
现在,这并没有完全解决您的“管理”问题。为此,您可以包含逻辑MegaController.Initialize()来询问请求信息。一旦您在上下文中获得了请求的路由和用户,您的代码就可以决定是否允许请求、重定向请求等。
protected override void Initialize(RequestContext context)
{
// ...
if(context.HttpContext != null)
{
if(context.HttpContext.Request.Path == "some/restricted/route"
&& CurrentUser.Role != "Admin")
{
// or similar error page
var url = Url.Action("UnAuthorized", "Error");
context.HttpContext.Response.Redirect(url);
}
}
}
Run Code Online (Sandbox Code Playgroud)
使用此方法的一个警告是,添加到应用程序中的任何新控制器都必须继承自MegaController,这是一种很容易被项目的未来开发人员错过的架构。
| 归档时间: |
|
| 查看次数: |
17700 次 |
| 最近记录: |