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时,您必须求助于操作过滤器的属性注入。或者使用两个类:一个用于过滤器,另一个用于属性。请检查以下内容: