如何抽象我的授权代码/整理我的控制器

时间:2014-02-24 10:49:22

标签: c# asp.net-mvc authentication ninject

任何人都可以推荐如何整理我的代码/使其更具用。 这就是:

如果控制器有[Authorize]该函数内的第一行代码,请阅读

    var user = GetUser(_userService);
    if (user == null)
    return RedirectToAction("Logout", "User");

这样我不仅可以检查身份验证cookie是否存在,还可以检查用户是否仍在数据库中。

我的获取用户函数非常简单,获取cookie,解密它然后使用服务层返回用户此函数在我的控制器继承的类中声明。

   public User GetUser(IUserService service)
    {
        var name = HttpContext.User.Identity.Name;
        var faDecrypt = FormsAuthentication.Decrypt(Request.Cookies[FormsAuthentication.FormsCookieName].Value);
        if (faDecrypt == null)
            return null;
        var userString = faDecrypt.Name;
        if (String.IsNullOrEmpty(userString))
            return null;
        return  service.Find(userString);
    }

我的所有控制器参数都是使用Ninject注入的,如下所示:

  public UserController(IUserService service, IUnitOfWork unitOfWork)
        {
            _service = service;
            _unitOfWork = unitOfWork;
        }

我面临的问题是我想把它移到某个地方:

“授权标记到位,运行获取用户以确保用户是真实的,如果真实继续,如果没有重定向”

我还要求此函数能够在Ninject中注入,因为每个服务都有HTTP请求生存期。


--- ---更新

实现如下所示的CustomAttribute后:

  public class EnhanchedAuthorize : ActionFilterAttribute

{
    private readonly IUserService _service;
    public EnhanchedAuthorize(IUserService service)
    {
        _service = service;
    }
}

当像这样使用时:

    [HttpPost]
    [EnhanchedAuthorize]
    public ActionResult Edit(VenueCreateEditViewModel model)

我收到以下错误

  

“构造函数EnhanchedAuthorize有1个参数但是被调用   0个参数“

Ninject为什么不处理这个?

2 个答案:

答案 0 :(得分:1)

您可以创建自己继承自ActionFilterAttribute的属性,并在此处实现重定向逻辑。

一些示例herehere

答案 1 :(得分:1)

不要在行动中定义_service,在基本控制器中定义它并采取行动:

public class EnhanchedAuthorize : ActionFilterAttribute
{
   public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            base.OnActionExecuting(filterContext);
            BaseController controller = filterContext.Controller as BaseController;

            //use service now
            controller.UserService.CallMethod();
            .....
        }
}