C# 如何提取我的授权代码/整理我的控制器

C# 如何提取我的授权代码/整理我的控制器,c#,asp.net-mvc,authentication,ninject,C#,Asp.net Mvc,Authentication,Ninject,有谁能推荐我如何整理我的代码/使其更易于使用。 情况就是这样: 如果控制器具有[Authorize]该函数中的第一行代码,则读取 var user = GetUser(_userService); if (user == null) return RedirectToAction("Logout", "User"); 这使我不仅可以检查身份验证cookie是否存在,还可以检查用户是否仍在数据库中 我的get user函数非常简单,获取cookie,对其进行解密,然后使用

有谁能推荐我如何整理我的代码/使其更易于使用。 情况就是这样:

如果控制器具有
[Authorize]
该函数中的第一行代码,则读取

    var user = GetUser(_userService);
    if (user == null)
    return RedirectToAction("Logout", "User");
这使我不仅可以检查身份验证cookie是否存在,还可以检查用户是否仍在数据库中

我的get user函数非常简单,获取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;
        }
我面临的问题是,我想把它搬到某个地方,上面写着:

“授权标记已就位,请运行get user以确保用户是真实的,如果是真实的,请继续,如果不是重定向”

我还要求能够在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不处理此问题?

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


一些示例和

没有定义运行中的服务,请在基本控制器和运行中定义它:

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

您能给出一个简单的例子吗?是否在基本控制器中授权操作:您能看到我的更新吗?您的EnhanchedAuthorize构造函数需要一个参数。创建一个无参数构造函数。更新后,我添加了答案“CheckForNow”,在使用Ninject时,您必须求助于操作过滤器的属性注入。或者使用两个类:一个用于过滤器,另一个用于属性。请检查以下内容: