새 MVC5 프로젝트 개발. CRUD 기능을위한 스캐 폴딩이 있지만 데이터가 삽입되거나 업데이트 될 때 전자 서명이 필요하다는 요구 사항이 있습니다. 데이터를 데이터베이스에 제출하기 전에 데이터를 확인하기 위해 사용자 이름과 암호를 다시 입력하라는 페이지가 사용자에게 제시되어야합니다. 입력 한 사용자 이름과 비밀번호가 유효하고 사용자 이름이 현재 로그인 한 사용자와 일치하면 입력 된 원래 데이터를 테이블 (예 : 회원)에 저장하고 전자 서명 정보를 별도의 테이블 (ESignature)에 저장할 수 있습니다. 이 문제를 해결하는 가장 좋은 방법에 대한 도움을 주시면 고맙겠습니다. Member와 ESignature를 결합한 뷰 모델 또는 계정 컨트롤러에서 LoginViewModel을 다시 사용하여 인증을 확인하거나 다른 방법을 사용할 수 있습니까? 전자 서명이 필요한 곳에서 수십 개의 컨트롤러에 사용할 수있는 무언가가 필요합니다.MVC5 EF6 데이터를 제출하기 전에 추가 인증과 함께 확인 화면을 추가하는 방법
답변
아마도 내 접근 방식이 최선이 아니지만 시도해 보겠습니다.
내 해결책은 CustomAttribute
: AuthorizeAttribute
을 만들고 Esignature가 필요한 모든 동작을 꾸미는 것입니다. CustomAttribute 구현에서는 로그인과 약간 비슷하게 수정 된 컨트롤러 동작으로 리디렉션됩니다.
public class CustomAuthorize : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
base.OnAuthorization(filterContext);
var url = filterContext.HttpContext.Request.Url;
var query = url.Query;
if (query.Contains("g="))
{
var code = query.Split(new String[] { "g=" }, StringSplitOptions.None);
//You can create time sensistive token and validate it.
}
else
{
//Redirect User to a particular page
filterContext.Result = new RedirectToRouteResult(
new RouteValueDictionary
{
{ "controller", "Account" },
{ "action", "elogin" },
{ "redirectUrl", url.AbsolutePath}
}
);
}
}
}
그런 다음 Index() 메서드를 사용하여 장식합니다. 처음에는
[CustomAuthorize]
public ActionResult Index()
{
return View();
}
당신은 다음 CustomAuthorizeAttribute
의 OnAuthorization
방법 안에 다른 루프가 실행됩니다 색인() 메소드를 쳤을 때 당신은 AccountController
내부 elogin
방법에 다시 보냅니다. 이 메소드는 로그인 HttpGet 메소드와 유사합니다. RedirectToResult를 지정하는 동안 현재 페이지의 redirectUrl 경로를 지정하고 있으므로 elogin 메소드 내부의 사용자를 성공적으로 확인한 다음 redirectUrl을 사용하여 다시 올 수 있습니다.
[AllowAnonymous]
public ActionResult ELogin(string returnUrl)
{
ViewBag.ReturnUrl = returnUrl;
return View("Login");
}
//
// POST: /Account/Login
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> ELogin(LoginViewModel model, string returnUrl)
{
if (ModelState.IsValid)
{
var user = await UserManager.FindAsync(model.UserName, model.Password);
if (user != null)
{
await SignInAsync(user, model.RememberMe);
var url = String.Format("{0}/?g={1}", returnUrl, "HashCode");
return RedirectToLocal(url);
}
else
{
ModelState.AddModelError("", "Invalid username or password.");
}
}
// If we got this far, something failed, redisplay form
return View(model);
}
HttpPost ELogin
방법의 유일한 차이점은 RedirectToLocal
을 수행하기 전에이 I/g = HasCode를 추가한다는 것이다. 참고 : 여기에 자신의 논리를 추가하여 시간에 민감한 해시를 만들 수 있습니다. 홈페이지로 리디렉션되면 OnAuthorization
URL을 검사 할 수 있습니다. URL에 g = HashCode가 포함 된 경우 로그인 페이지로 리디렉션되지 않습니다.
이것은 특정 컨트롤러를 공격 할 때마다 사용자가 강제로 다시 로그인하도록하는 방법에 대한 매우 기본적인 아이디어입니다. 추가 보안 점검을해야하며 URL을 통해 노출되는 내용에주의해야합니다.
뷰를 꾸미면 ELogin 메서드가 데이터를 입력하기 전에 호출됩니다. 사용자가 서명하여 데이터 입력을 확인하기 위해 리디렉션되기 전에 유효한 데이터를 먼저 입력 할 수 있어야합니다. 그런 다음 서명이 유효하면 데이터를 데이터베이스에 씁니다. – user2165345
제출 후 리디렉션하면 사용자가 다시 로그인하기 전에 데이터를 유지하지 않으면 데이터가 손실됩니다. – Mitul
나는 그것을 유지하고 성공적으로 서명하지 않으면 롤백 할 수 있습니다. 또한 Bootstrap Modal을 사용하여 페이지를 떠나지 않고 컨트롤러에서 사용하기 위해 모달에 입력 된 값을 가져 오는 방법을 모르겠다 고 생각합니다. – user2165345