Tags: , | Categories: Security Posted by talgiladi on 5/23/2008 8:52 PM | Comments (5)

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

webservice

עכשיו ניצור מחלקה חדשה שתייצג את ה Header שלנו

public class SecurityHeader : System.Web.Services.Protocols.SoapHeader
{
    public string username;
    public string pass;
}

כעת נגיד לשירות שלנו שהוא אמור לחכות ל Header הזה

[WebMethod]
[SoapHeader("SecurityHeader")]
public string HelloWorldSecure() {

כפי שניתן לראות מדובר בסך הכל בתוספת של שורה אחת
עכשיו עוד דבר קטן, נגדיר משתנה גלובלי מסוג המחלקה של ה Header שלנו

public class SayHello : System.Web.Services.WebService
{
    public SecurityHeader secHeader;

כעת כל פעם שמישהו יקרה לסרביס שלנו, השרת יבדוק אם יש לו Header מהסוג שציינו, ואם כן הוא יכניס את הערכים שהוא קיבל למשתנה הגלובלי שלנו במחלקה. כעת בתוך השירות אנחנו רק צריכים לבדוק שאכן המשתנה הגלובלי קיבל ערך(אכן יש כזה Header) ואז ניתן לבדוק את הנתונים שלו (שם משתמש וסיסמה במקרה שלנו)

if (secHeader == null)
{
    return "Please authenticate!";
}
    if (secHeader.username == "tal" && secHeader.pass == "giladi")
{
    return "Shalom " + secHeader.username;
}
    else
{
    return "Bad username or password";
}

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

 WebServiceRefference

קראתי להפניה הזאת server_sayHello
ניצור אובייקט של ההפניה הזאת

server_sayHello.SayHello sayHello = new server_sayHello.SayHello();

ניצור הפניה של ה Header שלנו באותה צורה

server_sayHello.SecurityHeader secHeader = new server_sayHello.SecurityHeader();

ניתן ערכים לשם והסיסמה

secHeader.UserName = "tal";
secHeader.Password = "giladi";
sayHello.SecurityHeaderValue = secHeader;

וזהו... פשוט נקרא לשירות:

string result = sayHello.HelloWorldSecure();

* אם אנחנו רוצים שהשירות יהיה מאובטח גם בעזרת SSL,(בהנחה שיש לכם תעודה והגדרתם אותה לשרת) פשוט נעשה מה שאנחנו עושים בדף ווב רגיל,
נוסיף שורה בסרביס עצמו, בתוך הפונקציה שלנו:

if (!HttpContext.Current.Request.IsSecureConnection)
{
    return "Please use secure connection!";
}

להורדת הפרוייקט

 

 

Technorati Tags: ,

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5
Tags: , | Categories: C#, sql Posted by talgiladi on 5/5/2008 9:28 PM | Comments (5)

משום מה השאלה הזאת נשאלת שוב ושוב בפורומים...
לשמור זה די ברור איך, אני יוצר פקודת sql עם פרמטרים, או stored procedure ,ומעביר אליה את הבתים של התמונה, כמובן שהעמודה בדטה בייס צריכה להיות מסוג image/binary.
לדוגמה:

 byte[] imagedata = null;

        //now we can get the image bytes with filestream on local system, or from FileUpload on our web page

        System.Data.SqlClient.SqlConnection con=new System.Data.SqlClient.SqlConnection("myconstring");

        System.Data.SqlClient.SqlCommand com = new System.Data.SqlClient.SqlCommand("insert into images (imagename,imagedata) values (@imagename,@imagedata)", con);

        com.Parameters.Add(new System.Data.SqlClient.SqlParameter("@imagename", "myimage.gif"));

 

        com.Parameters.Add(new System.Data.SqlClient.SqlParameter("@imagedata", imagedata));

        con.Open();

        com.ExecuteNonQuery();

יופי, איך מושכים, כרגיל, פקודת select רגילה כשמה שאנו מקבלים מהעמודה הזאת היא מערך של בתים עם נתוני התמונה.
עכשיו כדי להציג אותה ללקוח יש כמה שיטות. קודם כל ניתן להפוך את מערך הבתים לאובייקט של BitMap

  byte[] b=null;//get bytes from data base... b=(byte[])com.ExecuteScalar("select imagedata from myimages where...)

            MemoryStream ms=new MemoryStream(b);

            System.Drawing.Bitmap bm = new System.Drawing.Bitmap(ms);

או אם יש לי באתר דף שאמור להציג תמונות מדטה בייס לפי איזה פרמטר שהוא מקבל נשתמש ב Response.BinaryWrite כדי לכתוב את מערך הבתים. בדף הרגיל שבו מוצג הטקסט והתמונות נשים כתובת של תמונה עם כתובת של דף אחר, ובדף האחר נשתמש בפונקציה הזאת כדי לשלוח את הבתים בתור תמונה

נניח שיש לי דף PictureGallery.aspx
בתוך הדף אני רוצה להציג תמונות שימשכו מהדטה בייס. אני יוצר דף מיוחד שכל תפקידו הוא למשוך תמונה מהדטה בייס ולשלוח אותה ללקוח, נקרא לו PictureView.aspx
בדף PictureGallery.aspx אני שם לינקים לדף PictureView.aspx בתור כתובת של תמונה:

<img src="PictureView.aspx?imgid=34"/>

וככה מוסיף תמונות כמה שארצה. כעת בדף PictureView.aspx הקוד יראה משהו כמו:

 byte[] b = (byte[])com.ExecuteScalar("select imagedata from myimages where imageid=" + Request.Params["imgid"]);

 

        Response.ContentType = "image/jpeg";

        Response.BinaryWrite(b);

        Response.End();

Technorati Tags: ,

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5