2014-02-24 24 views
0

任何人都可以推荐如何整理我的代码段/使其更有用。 这是发生了什么:如何抽象我的授权码/收拾我的控制器

如果控制器具有[Authorize]第一行代码的那个函数内读取

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

这让我不仅要检查,如果身份验证cookie是存在的,但你也检查用户仍然在数据库中。

我的get用户函数非常简单,获取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); 
    } 

我所有的控制器parameteres使用Ninject注入,看起来像下面:

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

我现在面临的问题是我想搬到了这一点,在某个地方,它说:

“授权标签已到位,运行获取用户以确保用户是真实的,如果真的继续下去,如果不是重定向“

我还需要这个功能才能够在Ninj内注入因为每个服务都有一个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个参数(S),但被调用, 0参数(S)”

为什么Ninject不处理呢?

+0

在基地控制器里做授权操作:http://stackoverflow.com/a/21981920/1534785 –

+0

你能看到我的更新吗? – LmC

+0

您的EnhanchedAuthorize构造函数需要一个参数。创建一个无参数的构造函数。 –

回答

1

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

一些例子herehere

+0

你能举一个简单的例子吗? – LmC

+0

我编辑了我的答案 –

+0

你能看到我的更新吗? – LmC

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(); 
      ..... 
     } 
}