מדריך ASP.NET MVC

מדריך ASP.NET MVC – הרשאות

‏ • Hi Tech

בפרק הקודם בנינו את מסד הנתונים עפ"י המודל. בפרק זה נרחיב את המסד ע"י תמיכה בהרשאות.

ASP.NET מכיל תשתית לניהול משתמשים הנקראת Membership. תשתית זו רלוונטית גם בעבודה עם ASP.NET MVC. על מנת שנוכל ליהנות מתשתית זו עלינו לעדכן את ה-Schema של מסד הנתונים כך שתכיל את הטבלאות הנדרשות.

להורדת הקוד של הפרק הקודם לחץ כאן

פתח חלון פקודה חדש ע"י: Start | cmd

שנה את הספרייה הנוכחית לספריית ההתקנה של NET Framework.
cd c:\Windows\Microsoft.NET\Framework\v4.0.30319

הרץ את הפקודה הבאה aspnet_regsql.exe:

image

image

לחץ "Next" ובחר את האפשרות "Configure SQL Server for application services"

image

לחץ "Next" ובחר את מסד הנתונים המתאים:

image

חלץ על "Next" כמה פעמים שנדרש:

image

ה-Wizard בו השתמשנו אחראי על יצירת הטבלאות הנדרשות בתוך מסד הנתונים שלנו. וודא ע"י ה-Database Explorer כי אכן הטבלאות נוצרו:

image

פתח את הקובץ Web.config ועדכן את הקונפיגורציה הבאה:

<configuration>
<
connectionStrings
>
<
remove name="LocalSqlServer"
/>
<
add name="LocalSqlServer"
connectionString="Data Source=.\SQLEXPRESS;
Initial Catalog=AddressBookDB;
Integrated Security=True
"
/>
</
connectionStrings
>


...

</configuration>

שינוי זה מודיע לתשתיות של ASP.NET מיהו מסד הנתונים שמכיל את המידע לגבי משתמשים וסיסמאות.

פתח את Solution Explorer ועמוד על הפרויקט. מהתפריט הראשי בחר: Project | ASP.NET Configuration

image

בחר "Security" ולאחריו "Create User"

image

צור שני משתמשים חדשים: ori ו-roni

image

לאחר יצירת המשתמשים חזור לדף הראשי של ה-Administration Tool ובחר שוב "Security". הדלק את האופציה של "Roles":

image

לאחר מכן צור שני roles חדשים בשם: admin ו-user ושייך אליהם את המשתמשים שיצרת מקודם. כאשר roni שייכת ל-admin role ו-ori שייך ל-user role

image

image

לאחר שיצרנו את הטבלאות במסד הנתונים ומלאנו אותן באינפורמציה על משתמשים חדשים ניתן לעדכן את הקוד על מנת לתמוך בהרשאות.

פתח את הקובץ Controllers\GroupController.cs ועדכן את המחלקה GroupController ע"י עיטורה ב-Attribute בשם Authorize:

[Authorize]
public class GroupController : Controller
{
  ...
}

הרץ את התוכנית ובחן את השגיאה שמתקבלת:

image

ה-Attribute שהוספנו למחלקה GroupController גורם לתשתית של ASP.NET MVC למנוע גישה לכל ה-Actions של המחלקה עבור משתמשים שאינם מזוהים. במקרה שכזה התשתית מפנה את המשתמש הלא מזוהה לתצוגת Logon.

הוסף מחלקה חדשה בשם "LoginDetails" לספריית ה-Models אשר מייצגת את פרטי המשתמש:

public class LoginDetails
{
  [Required(ErrorMessage = "Please specify a user name")]
  [Display(Name = "User Name")]
  public string UserName { get; set; }

  [Required(ErrorMessage = "Please specify a password")]
  [Display(Name = "Password")]
  [DataType(DataType.Password)]
  public string Password { get; set; }
}

הוסף Controller חדש בשם AccountController ועדכן בתוכו Actions חדשים אשר מטפלים בפעולת ה-Logon:

public class AccountController : Controller
{
  [HttpGet]
  public ActionResult Logon()
  {
    return View();
  }

  [HttpPost]
  public ActionResult Logon(string userName, string password)
  {
    if (!Membership.ValidateUser(userName, password))
    {
      this.ModelState.AddModelError("summary",
"Invalid user name or password");

      return View();
    }

    FormsAuthentication.RedirectFromLoginPage(userName, false);

    return null;
  }
}

שים לב כיצד הקוד משתמש בתשתית ה-Membership וכן במחלקה FormsAuthentication על מנת לזהות את המשתמש. מחלקות אלו אינן חדשות ל-ASP.NET MVC וניתן לקרוא עליהן בהרחבה ב-MSDN

צור תצוגה חדשה עבור ה-Logon Action ובחר את המחלקה LoginDetails להיות המודל של התצוגה:

image

עדכן את הקוד של התצוגה כך שיראה באופן הבא:

@model AddressBook.Models.LoginDetails
@{
  ViewBag.Title = "Login";
}
@
using (Html.BeginForm())
{
  @Html.ValidationSummary(true)

  <div class="login">
    <fieldset>
      <div class="editor-label">
        @Html.LabelFor(model => model.UserName)
      </div>
      <div class="editor-field">
        @Html.EditorFor(model => model.UserName)
        @Html.ValidationMessageFor(model => model.UserName)
      </div>
      <div class="editor-label">
        @Html.LabelFor(model => model.Password)
      </div>
      <div class="editor-field">
        @Html.EditorFor(model => model.Password)
        @Html.ValidationMessageFor(model => model.Password)
      </div>
      @Html.ValidationSummary()
      <p>
        <input type="submit" value="Login" />
      </p>
    </fieldset>
  </div>
}

הרץ את התוכנית וודא כי ניתן לבצע Logon בעזרת המשתמש ori:

image

עד עכשיו מנענו גישה למערכת ממשתמשים שאינם מזוהים. השלב הבא הוא לבצע הבחנה בין משתמש בעל הרשאות גבוהות הרשאי לעשות שינויים במערכת לבין משתמש רגיל הרשאי רק לקרוא נתונים אבל לא לשנות אותם.

עדכן את כל ה-Actions של כל ה-Controllers אשר משנים נתונים במערכת כך שיהיו מוגנים ע"י ה-Attribute בשם-Authorize, לדוגמא:

[HttpGet]
[Authorize(Roles="admin")]
public ActionResult Create(int parentId)
{
  AddressBookDB db = AddressBookDB.Create();

  Group parent = (Group)db.GetItemByID(parentId);
  Group newGroup = new Group() { Parent = parent };

  return View(newGroup);
}

שים לב לשימוש ב-Authorize Attribute. להבדיל מההגדרה הקודמת (ברמת המחלקה) הגדרה זו מציינת במפורש את ה-Roles אשר רשאים להפעיל את ה-Action. בדוגמא ציינו כי רק משתמש שהוא חלק מה-Admin Role רשאי להפעיל את ה-Action.

הרץ את התוכנית, כנס תחת המשתמש ori (שהוא איננו admin) וודא כי לא ניתן לבצע שינויים במערכת. הרץ שוב את התוכנית, כנס הפעם תחת המשתמש roni וודא כי ניתן לבצע שינויים במערכת.

 

בפרק זה למדנו כיצד להוסיף הרשאות לתוכנית שלנו. ראינו כי הדבר דורש שינויים ברמת מסד הנתונים וכן שימוש ב-Attributes ברמה של ה-Controllers וה-Actions המתאימים.

תגיות: , , , ,

תגובות בפייסבוק