2014-03-24 1 views
1

새 MVC5 프로젝트 개발. CRUD 기능을위한 스캐 폴딩이 있지만 데이터가 삽입되거나 업데이트 될 때 전자 서명이 필요하다는 요구 사항이 있습니다. 데이터를 데이터베이스에 제출하기 전에 데이터를 확인하기 위해 사용자 이름과 암호를 다시 입력하라는 페이지가 사용자에게 제시되어야합니다. 입력 한 사용자 이름과 비밀번호가 유효하고 사용자 이름이 현재 로그인 한 사용자와 일치하면 입력 된 원래 데이터를 테이블 (예 : 회원)에 저장하고 전자 서명 정보를 별도의 테이블 (ESignature)에 저장할 수 있습니다. 이 문제를 해결하는 가장 좋은 방법에 대한 도움을 주시면 고맙겠습니다. Member와 ESignature를 결합한 뷰 모델 또는 계정 컨트롤러에서 LoginViewModel을 다시 사용하여 인증을 확인하거나 다른 방법을 사용할 수 있습니까? 전자 서명이 필요한 곳에서 수십 개의 컨트롤러에 사용할 수있는 무언가가 필요합니다.MVC5 EF6 데이터를 제출하기 전에 추가 인증과 함께 확인 화면을 추가하는 방법

답변

0

아마도 내 접근 방식이 최선이 아니지만 시도해 보겠습니다.

내 해결책은 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(); 
} 

당신은 다음 CustomAuthorizeAttributeOnAuthorization 방법 안에 다른 루프가 실행됩니다 색인() 메소드를 쳤을 때 당신은 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을 통해 노출되는 내용에주의해야합니다.

+0

뷰를 꾸미면 ELogin 메서드가 데이터를 입력하기 전에 호출됩니다. 사용자가 서명하여 데이터 입력을 확인하기 위해 리디렉션되기 전에 유효한 데이터를 먼저 입력 할 수 있어야합니다. 그런 다음 서명이 유효하면 데이터를 데이터베이스에 씁니다. – user2165345

+0

제출 후 리디렉션하면 사용자가 다시 로그인하기 전에 데이터를 유지하지 않으면 데이터가 손실됩니다. – Mitul

+0

나는 그것을 유지하고 성공적으로 서명하지 않으면 롤백 할 수 있습니다. 또한 Bootstrap Modal을 사용하여 페이지를 떠나지 않고 컨트롤러에서 사용하기 위해 모달에 입력 된 값을 가져 오는 방법을 모르겠다 고 생각합니다. – user2165345