2012-04-03 24 views
3

Webサービスを使用しており、BaseControllerクラスからアクセスしています。私は、サーバーの検証を実行して、ログインが有効かどうかを確認したいと思います。そうすれば、メッセージが有効でない場合は、警告メッセージを送信することができます。アラートはクライアントが必要です。私はMVCの初心者ですが、いくつかの基本を知っています。モデルを使用しないASP.NET MVC ajaxサーバー側の検証

私は、私が求めていることの裏にあるセキュリティを理解しています。ログインは最も簡単な例です。

別の例

私はお問い合わせフォームがあります。私はページを更新せずにサーバーの検証をしたい。私はAJAXでフォームを投稿することができます。私はエラーのリストを返し、ページに表示する必要があります。この検証は、コントローラから呼び出されたWebサービスメソッドで行われます。

+0

を求めていますか? – jrummell

+0

Webサービスからカスタムオブジェクトを取得しています。標準のMVCのものやモデルではありません。だから私は "組み込みの"メソッドを使用することはできません。したがって、認証というだけでなく、ページを離れずにカスタムオブジェクトをWebサービスから取得することも少なくなります。 – TylerJPresley

答えて

1

public AuthController 
{ 
     [HttpPost] 
     public JsonResult CheckAuthentication(string UserName, string Password) 
     { 
      return Json(Membership.ValidateUser(UserName, Password)); 
     } 
} 

JS:

あなたの質問は...

CSので、ここで、混乱して基本的な考え方でありますサーバコントローラに接続してクライアントスクリプトの結果を得るには、このようにすることができます

アクションがありますメソッドを使用して、このようなユーザー名のパスワードの組み合わせを検証します。あなたはあなたのメソッドで行うバリデーションに基づいてアクションメソッドからJsonを返します。 jSon通信に使用できるクラス「JsonDataResult」を宣言します。このクラスには、「Message」という文字列プロパティ(「成功」/「エラー」)と、エラーメッセージが格納されている場合はそれを格納する文字列のリストがあります。

public class JsonDataResult 
{ 
    public string Message { get;set;} 
    public List<String> Items = new List<String>(); 
} 

とここに私の対処法は、ユーザー名とパスワードが正しい場合は、「成功」とのメッセージの値を設定することができます

public ActionResult Logon(string userName,string password) 
    { 
     // check your username password and if there is its not valid, do this 
     List<String> errors = new List<String>(); 
     errors.Add("username is not available"); 
     errors.Add("password is not nice!"); 

     var data = new JsonDataResult { Message = "Errors", Items = errors }; 
     return Json(data); 
    } 

のように見えています。エラーメッセージの追加もスキップできます。

クライアントスクリプトから、jQuery postを使用してデータをアクションメソッドに送信し、jSon結果を受け取り、メッセージプロパティの値を確認します。 「エラー」と表示された場合は、各エラーをループして表示します。

$(function() { 
    $("form").submit(function() { 
     $.post('@Url.Action("Logon","Account")', { userName: $("#username").val(), password: $("#password").val() }, function (data) { 

      if (data.Message == "Errors") { 
       $.each(data.Items, function (index) { 
        alert(data.Items[index]); 
       }); 
      } 
      else 
      { 
       // validation is successful.May be you want to redirect now ? 
      } 
     }); 
     return false; 
    }); 
}); 
1

はちょうどあなたのウェブサイトは、資格情報を使用してAJAX POSTを起動していると、この呼び出し:JSONの結果(ないビュー)を返すと、ウェブサイト上であなたのjQueryコードで結果をチェックすると

FormsAuthentication.SetAuthCookie(userEmail or whatever, true); 

を。

+0

「JSON結果(ビューではない)を返し、Webサイト上のjQueryコードで結果を確認する」という良い例がありますか? – TylerJPresley

1

メンバーシッププロバイダーを使用しており、ユーザーを検証する必要がある場合は、以下を使用できます。

bool isValidLogin = Membership.ValidateUser(UserName, Password); 

OR AJAXリクエストによってパスワードを渡すと、おそらく良いアイデアではありませんが、このような

bool isValidLogin = FormsAuthentication.Authenticate(UserName, Password); 
0

何かを次の中から助けを得ることを試みます。あなたが本当にあなたのユーザー名とパスワードを渡したい場合は

var authChecking = $.post("/Auth/CheckAuthentication", { UserName: username, Password: password }); 
authChecking.done(function(result) { if (!result) 
    { 
     alert("Invalid"); 
     // or dialog or whatever. 
    } 
}); 
+0

はおそらくユーザー名を渡して有効なユーザー名かどうかを返しますが、システムにどのユーザー名が存在するかをユーザーに示すセキュリティ上のベストプラクティスではないと考えています –

+0

私はあなたの懸念を理解しています。それは閉じたシステムです。概念プロトタイプの証明。後で別の方法でログインを処理することができますが、そのコンセプトは他のフォームにとって重要です。説明するのが最も簡単な例でした。 – TylerJPresley

+0

別の例を追加しました。 – TylerJPresley

0

私は緩く、対応機種を持っていた動的なコンテンツの多くのためにいくつかの点でいくつかのカスタム検証ロジックを記述しなければならなかったが、選択したオプションに基づいて検証が異なっていました。私はちょうどコピーし、私のアプリからコードを貼り付け、それを愚かにするつもりですが、あなたは基本的な例に従うことができます。これは、複数のタブに複数のフォームを保存するためのものですが、同様に動作しますが、おそらく単純化することもできます。JSは古いもので、約束事や配布されたイベントでもきれいにすることができますが、別の日。

JS:

$("button#Save").on("click", function() { 
      // checks if existing errors have been cleared before trying to submit again 
     if ($(".ui-state-error, .ui-state-error-text", "#tabs").length) { 
      alert("There are errors on the page. You must correct any errors before saving."); 
     } 
     else { 
       // don't allow to submit twice.. again.. better ways to do this.. 
      if (!Saving) { 
       Saving = true; 
          // show saving message overlay 
       $('#CanvasLoading').html("Saving...<span>Loading</span>").show(); 
       //map data 
          // PASSES IN THE ID OF THE FORM 
       var data = $("form.create-item-form", "#tabs").map(function() { 
        var $form = $(this); 

        return { 
         Name: $form.find(":input[name=Name]").val(), 
         FolderName: $form.find(":input[name=FolderName]").val(), 
         ItemName: $form.find(":input[name=ItemName]").val(), 
         ViewId: $form.find(":input[name=ViewId]").val(), 
         FormId: $form.attr("id") 
       }).toArray(); 

       $.ajax(
       { 
        url: Routes.New.SaveAllPost, 
        type: 'POST', 
        contentType: 'application/json', 
        data: { items: data }, 
        success: function (resultJSON) { 
         var result = $.parseJSON(resultJSON); 
         if (result.Success) { 
           Saving = false; 
          }); 
         } 
         else { 
          $.each(result.Errors, function (i, item) { 
    // loops through all items and applies class ui-state-error to inputs in the form with given id 
           var formId = item.FormId; 
           var propertyName = item.FieldName; 
           $.each(item.Errors, function (i, error) { 
            var id = $("input[name=" + propertyName + "], select[name=" + propertyName + "]", "#" + formId).addClass("ui-state-error").parents("div.ui-tabs-panel:first").attr("id"); 
            $("#li-upload-" + id, "#tabs").addClass("ui-state-error"); 
           }); 
          }); 

           // hide loading overlay 
          $('#CanvasLoading').hide(); 
          Saving = false; 
         } 
        } 
       }); 
      } 
      else { 
       alert("You have already started saving. Please wait for results to process."); 
      } 
     } 
     return false; 
    }); 

C#の:あなたは、検証や認証について

public class NewController : Controller 
    { 
[HttpPost] 
     public JsonResult SaveAll(List<UploadViewModelDTO> items) 
     { 
      UploadItemValidationDTO validation = ValidateItems(items); 
      if (validation.Success) 
      { 
       // validated: do stuff 

      } 

      return Json(validation); 
     } 
} 

private UploadItemValidationDTO ValidateItems(List<UploadViewModelDTO> items) 
     { 
      UploadItemValidationDTO validation = new UploadItemValidationDTO(); 

      // check for errors 
      // if error add using following code 
      // error has field name and id of form it came from 
      validation.Errors.Add 
      (
       new Error 
       { 
        Errors = new List<string>() { "Folder is required" }, 
        FieldName = "FolderName", 
        FormId = item.FormId 
       } 
      );   

      validation.Success = (validation.Errors.Count < 1); 

      return validation; 
     } 

public class UploadItemValidation 
    { 
     public UploadItemValidation() 
     { 
      Errors = new List<Error>(); 
     } 

     public bool Success {get;set;} 
     public List<Error> Errors {get;set;} 
    } 

    public class Error 
    { 
     public string FormId {get;set;} 
     public string FieldName {get;set;} 
     public List<string> Errors {get;set;} 
    } 
関連する問題