ASP.NET MVC: בעיה בהחזרת טוקן השתול בטופס
-
יש לי טופס שאני רוצה לשלוח לשרת ואני כולל בו טוקן כדי למנוע מתקפת CSRF - Cross site request forgery.
אולם הבעיה היא שאני מקבל שגיאה מספר 500 עם הטענה שהטוקן לא קיים בדף..
אשמח לעזרה!<form action="~/Home/Create" method="get" id="myform"> @Html.AntiForgeryToken() <input type="submit" value="הוסף מוצר" class="btn btn-primary" /> </form>
תודה רבה רבה!
פורסם במקור בפורום CODE613 ב22/12/2015 11:05 (+02:00)
-
מצאתי כאן (לקראת הסוף) תשובה שהבעיה הזאת נגרמת בגלל שאני שולח את הנתונים עם AJAX בלי לרפרש את הדף.
הפתרון שהוא מציע הוא טוב רק אם אני כותב את הקוד עצמו גם בRAZOR. (ואז אני יכול לקרוא לפונקציות של C#).
הבעיה היא שאני כותב את קובץ הJS בתור קובץ נפרד, ושם אני לא יכול להשתמש ביכולות של הRAZOR.
האם ישנה דרך לקרוא למתודות הללו בצורה אחרת, או לבצע את אותו דבר בצורה שונה?
תודה רבה רבה מראש!!
אברהם.פורסם במקור בפורום CODE613 ב31/12/2015 10:26 (+02:00)
-
מה זה קובץ JS נפרד? לא שיש בעיה כל שהיא לשלוח JS עם השתלה של טוקן עם RAZOR (פשוט chtml שמכיל רק סקריפט עטוף בתגית סקריפט) או בלעדיו (פשוט לכתוב את הJS עם שומר מקום ולמלאות עם string.format). רק שאמור להיות פתרון פשוט בהרבה.
הרי הטופס מתבסס על קלט מהלקוח, לא כן? הקלט הזה שוכן בקומבינציה כל שהיא בדף HTML, לא?
תוכל לתאר את התהליך?
כל הרעיון של טוקן זה לוודא המשכיות. רק זה שביקש את הטופס (הדף של האתר שלך) יכול לשלוח אותו.פורסם במקור בפורום CODE613 ב04/01/2016 11:23 (+02:00)
-
@דוד ל.ט.
מה זה קובץ JS נפרד? לא שיש בעיה כל שהיא לשלוח JS עם השתלה של טוקן עם RAZOR (פשוט chtml שמכיל רק סקריפט עטוף בתגית סקריפט)
התכוונתי שהקוד של הJS לא נכתב באותו דף של הHTML, ולכן הוא נשמר עם סיומת JS.
לא חשבתי על הרעיון לשמור אותו בתור קובץ cshtml.
@דוד ל.ט.או בלעדיו (פשוט לכתוב את הJS עם שומר מקום ולמלאות עם string.format).
לא הבנתי איך אני כותב קובץ בפורמט JS ומשתמש בשומר מקום, אשמח אם תוכל לפרט..
@דוד ל.ט.רק שאמור להיות פתרון פשוט בהרבה. הרי הטופס מתבסס על קלט מהלקוח, לא כן? הקלט הזה שוכן בקומבינציה כל שהיא בדף HTML, לא?
תוכל לתאר את התהליך?
כל הרעיון של טוקן זה לוודא המשכיות. רק זה שביקש את הטופס (הדף של האתר שלך) יכול לשלוח אותו.חשבתי שזה אמור להיות מאד פשוט אבל הסתבכתי וזה לא בדיוק עובד..
הנה זה מה שכתבתי:
תודה רבה!<form action="~/Home/Create" method="get" id="myform"> @Html.AntiForgeryToken() @Html.LabelFor(model=>model.SumDonation, new { @class = "col-sm-6"}) @Html.EditorFor(model => model.SumDonation, new { @class="col-sm-6"}) <input type="submit" value="שלח" class="btn btn-primary" /> </form>
אני מנסה לשלוח אותו בAJAX ע"י הקוד הזה:
$("#myform").ajaxForm();
וכמו שכתבתי אני מקבל שגיאה מספר 500 בזו הלשון:
The required anti-forgery form field "__RequestVerificationToken" is not present.אולם, כשאני מדבאג את הדף השדה הזה כן נוכח בדף..
<input name="__RequestVerificationToken" type="hidden" value="KWKFiT8WnEdf-4svBItF1IjRiO8jLtEau53m41IGBrN5WyTq0ynUGbbhCvwW7GLeQ_R-8XNo3LZT88JrPvU-AcA1PV7B7bOJHkUOp9g_yQw1">
פורסם במקור בפורום CODE613 ב05/01/2016 15:16 (+02:00)
-
ראיתי עכשיו שהייתה לי טעות בדוגמא הזאת, כיון שבקוד הHTML כתבתי action="get" אולם בקונטרולר המתודה מוגדרת כPOST. ואכן כששיניתי לaction=post זה עבד, ולא הייתה שום בעיה.
אולם כשאני משתמש בזה במקומות אחרים, ולא משתמש בajaxForm אלא שולח את הנתונים ע"י בקשת AJAX רגילה - אני אכן מקבל את השגיאה הזאת שוב..פורסם במקור בפורום CODE613 ב05/01/2016 15:52 (+02:00)