Asp.net mvc 5 是否应从控制器中删除登录逻辑
我正试图遵循最佳实践,并确保我的控制器在服务层中执行主要业务逻辑的地方保持精益 在下面的操作中,我已将验证登录代码提取到服务层,但不确定处理HttpConext.GetOwinContext.Authentication并创建声明标识的逻辑应该放在哪里 看起来控制器操作中的代码太多了,还是可以保留在这里? 它应该留在控制器中还是提取到自己的服务基础设施或某种静态类中 我有点被困在这将是什么或它持有 我正试图遵循洋葱的架构Asp.net mvc 5 是否应从控制器中删除登录逻辑,asp.net-mvc-5,onion-architecture,Asp.net Mvc 5,Onion Architecture,我正试图遵循最佳实践,并确保我的控制器在服务层中执行主要业务逻辑的地方保持精益 在下面的操作中,我已将验证登录代码提取到服务层,但不确定处理HttpConext.GetOwinContext.Authentication并创建声明标识的逻辑应该放在哪里 看起来控制器操作中的代码太多了,还是可以保留在这里? 它应该留在控制器中还是提取到自己的服务基础设施或某种静态类中 我有点被困在这将是什么或它持有 我正试图遵循洋葱的架构 如果您的系统有多个前端,将其提取到自己的服务中可以确保无需重写代码即可重用
如果您的系统有多个前端,将其提取到自己的服务中可以确保无需重写代码即可重用代码。如果这不是一个问题,那么您可能可以将其留在控制器中,那么如果我将其提取到服务中,是否可以将HttpContext传递到服务中?或者我想我可以传递IAAuthenticationMangaer类型,这样服务层就不需要了解HttpContext。但该服务仍需要引用Microsoft.AspNet.Identity.DefaultAuthenticationTypes和System.Security.Claims。
public ActionResult Index(LoginViewModel model, string returnUrl)
{
ViewBag.ReturnUrl = returnUrl;
if (ModelState.IsValid)
{
if (_service.ValidateLogin(model.CustomerCode, model.Username, model.Password))
{
var user = _service.GetUserByUsername(model.Username);
var identity = new ClaimsIdentity(new[] {
new Claim(ClaimTypes.NameIdentifier, model.Username),
new Claim(ClaimTypes.Name, user.Name)
}, DefaultAuthenticationTypes.ApplicationCookie, ClaimTypes.Name, ClaimTypes.Role);
HttpContext.GetOwinContext().Authentication.SignIn(new AuthenticationProperties
{
IsPersistent = true
}, identity);
return RedirectToLocal(returnUrl);
}
else
{
ModelState.AddModelError(string.Empty, "Invalid Client Code, Username or Password");
}
}
return View(model);
}