‏הצגת רשומות עם תוויות IIS. הצג את כל הרשומות
‏הצגת רשומות עם תוויות IIS. הצג את כל הרשומות

יום שבת, 29 בספטמבר 2012

Web Service Authentication ASP.NET




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

אז כמו שאתם יודעים (בתקווה...) Web Service מכיל בתוכו פונקציות מרוחקות שממקומות בשרת שנותן שירותים לתוכניות שמבצעות קריאות לאותן פונקציות (API) ובעצם מחלקים את תחומי האחריות של התוכנית ובונים מרכז לוגי משותף לכל התוכניות שצריכות שירות מה Service ללא תלות בארכיטקטורה.

נבנה פרויקט חדש ב Visual Studio.



מבנה הפרוייקט


נערוך את קובץ Service1.asmx ונוסיף לתוכו 3 פונקציות:

  public class Service1 : System.Web.Services.WebService
    {
        [WebMethod]
        public string restricted_functionA()
        {
            return "restricted_functionA";
        }

        [WebMethod]
        public string restricted_functionB()
        {
            return "restricted_functionA";
        }

        [WebMethod]
        public string restricted_functionC()
        {
            return "restricted_functionA";
        }
    }


נריץ את ה Web Service בדפדפן ונגיע לדף Webservice1.asmx  שחושף לנו את הפונקציות של ה Web Service , כאן בעצם יש בעייה , אנחנו ממש לא מעוניינים לחשוף את הפונקציות של ה Service שלנו לכל אחד ובמיוחד לא לחשוף אותו בחיפושים ב Google כבר היום ניתן למצוא מליונים Web Services חשופים.


רק כדי להמחיש את הסכנה אני אשתמש ב Google ככלי פריצה וסריקה ( Google Hack) בעזרת החיפוש המתקדם במנוע ניתן לחפש חשיפות לדוגמה, אם נרשום בחיפוש filetype:asmx נקבל את כל הדפים ש Google מצא בסיומת asmx.


מכאן אנחנו מדרדרים וה Web Service שלנו חשוף מתמיד לכל אחד בכל מקום, הגיע הזמן לצאת מהבריכה של הילדים ושאריות ד.נ.א לא רצוי ולעבור לבריכה של הגדולים, קיימות מספר דרכים להגן על ה Web Service משלב ההעלמה מגוגל ותהליך Authentication מול ה Service שלנו.

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

קודם כל העלמת השירות מגוגל, נכתוב קובץ robots.txt ונשמור אותו בתיקייה של הפרויקט, נרשום את השורות הבאות:

User-agent: *
Disallow: /

ונמנע מ Google לסרוק את ה Service שלנו, עד כאן היה החלק הפשוט בכל הסיפור ועכשיו נתחיל את תהליך Authentication.

 Forms Authentication

הדרך הפשוטה ביותר לאבטח את ה Web Service שלנו, על מנת לגשת ל Web Service יש להפעיל את פונקצית Login בשביל להתחבר ל Service, מה שקורה בפועל שהשם משתמש והסיסמא נבדקים מול ה DB ובמקרה שהם נכונים ה Web Service רושם Cookie עם Ticket אצל ה Client.

Webservice

using System;
using System.Collections.Generic;
using System.Web;
using System.Web.Services;
using System.Web.Security;

namespace WebService1
{
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    public class Service1 : System.Web.Services.WebService
    {
        private string Authenticate(string user, string pass)
        {
            //check the credential from DB or hard coded.
            if (user == "proxytype" && pass == "password")
                return "Proxytype connect";
            else
                return null;
        }

        [WebMethod]
        public bool login(string user, string pass)
        {
            string isLog = Authenticate(user, pass);

            if (isLog != null)
            {
                //return authentication cookie
                FormsAuthentication.SetAuthCookie(user, false);
                return true;
            }
            else
                return false;
        }

        [WebMethod]
        public void logout()
        {
            FormsAuthentication.SignOut();
        }

        [WebMethod]
        public string restricted_functionA()
        {
            //check if user authentication before execute
            if (Context.User.Identity.IsAuthenticated)
               return "Access Granted Restricted FunctionA";
            return "Access Denied Restricted FunctionA";
        }

        [WebMethod]
        public string restricted_functionB()
        {
            //check if user authentication before execute
            if (Context.User.Identity.IsAuthenticated)
                return "Access Granted Restricted FunctionB";
            return "Access Denied Restricted FunctionB";
        }

        [WebMethod]
        public string restricted_functionC()
        {
            //check if user authentication before execute
            if (Context.User.Identity.IsAuthenticated)
                return "Access Granted Restricted FunctionC";
            return "Access Denied Restricted FunctionC";
        }
    }
}


Client

using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using example1.localhost;
namespace example1
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            //create new instance for the webservice
            Service1 myservice = new Service1();
            //create a cookie container for the return 
            //cookie from the web service
            myservice.CookieContainer = new System.Net.CookieContainer();
            
            myservice.login("proxytype", "password");
            Response.Write(myservice.restricted_functionA());

        }
    }
}


למרות שהמשתמש לא יכול להשתמש בפונקציות הן עדיין חשופות והמשתמש עדיין יכול לראות אותם אם הוא יכניס את הכתובת של ה Web Service בדפדפן שלו וזה עדיין לא מספיק מאובטח, המטרה שכל גישה לא מורשה תקבל הודעת שגיאה 401.1 Unauthorized, תחילה יש לשנות הגדרה ב IIS עצמו, בתגית Authentication במצב Feature View יש לבטל את ה Anonymous Authentication , ולהפעיל את ה Basic Authentication:


כשהמשתמש ינסה להכניס את הכתובת של ה Service בדפדפן הוא יצטרך להכניס שם משתמש וסיסמא , במקרה שהם לא נכונים הוא יקבל שגיאה 401.1 Unauthorized.



בשביל להעביר את ה Credentials יש לבצע מספר שינויים ב Client:

using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using example1.localhost;
using System.Net;
namespace example1
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            //create new instance for the webservice
            Service1 myservice = new Service1();
           
            //create net credentials
            CredentialCache myCredentials = new System.Net.CredentialCache();
            NetworkCredential netCred = new NetworkCredential("proxytype", "password");

            //sign the credentials as basic authentication 
            myCredentials.Add(new Uri(myservice.Url), "Basic", netCred);
            myservice.Credentials = myCredentials;

            //create a cookie container for the return 
            //cookie from the web service
            myservice.CookieContainer = new System.Net.CookieContainer();
            
            myservice.login("proxytype", "password");
            Response.Write(myservice.restricted_functionA());
           

        }
    }
}

חשוב מאוד!  

Basic Authentication מתבסס על שמות והסיסמאות של המשתמשים שרשומים במערכת ההפעלה של ה Service, מומלץ ליצור משתמש חדש עם הרשאות מוגבלות , במקרה שאין SSL השם משתמש והסיסמא עוברים כ Clear Text והם חשופים לכל מי שמאזין על הרשת.

סיכום:

משחקי הרשאות עלולות להפוך את העסק למאוד מסורבל וחשוב מאוד לפשט כמה שאפשר את פריסת האבטחה סביב התוכנית שלנו, ניתן להשתמש בצורות Authentication נוספות כמו Windows ו Digest , כמובן לא לשכוח להשתמש ב SSL.

לא לחשוף סתם...

יום שבת, 22 בינואר 2011

Information Gathering

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

איסוף האינפורמציה מתבצע בהמון טכניקות במטרה לקדם את ההתקפה, נניח שיש 2 חברות (אחת נקרא ל A ולשניה B) והן מיצרות את אותו מוצר וכל אחת תופסת חצי מהשוק, הפלטפורמה השיווקית שלהם היא האינטרנט, ובעל הבית של חברת A התחרפן על דעתו והחליט שהוא רוצה לתפוס 80 אחוז מהשוק, הוא ניסה בדרכים ישרות וכשראה שזה בלתי אפשרי הוא הלך לצד האפל ברשת והפעיל קבוצה של אנשים מסתוריים שיעשו בשבילו את העבודה.

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

מי האויב שלנו?
השלב הראשון באיסוף המידע הוא להבין את מי אנחנו הולכים לתקוף, נעשה עליו חיפושים לגיטימיים ברחבי הרשת
  1.  נשאל את Google (הכי פשוט והכי מהיר).
  2.  נבדוק באתרים פיננסיים (גודל החברה, מיקומים, מנכ"לים, כספים).
  3. רשתות חברתיות (שמות של עובדים, חברים של העובדים, בלוגים).

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

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

יש עשרות כלים לזיהוי חשיפות שמאפשרות לתוקף למצוא לו את ההתקפה המתאימה.


Nmap
אחד הכלים הותיקים והמפורסמים בתחום מכיל בתוכו המון אפשריות, ובעצם הכלי סריקה האמין ביותר שקיים,ניתן לזהות את מערכות ההפעלה, הפורטים ואת ה Services שרצים על השרת, והוא ניתן להורדה מהאתר: http://nmap.org/ , יש לו גרסאות  Gui ו Console ומגיע עם Backtrack , הוא מפורסם גם בתעשיית הסרטים וניתן לראות בסרטים כמו :
Matrix Reloaded, Bourne Ultimatum, Die Hard 4.

דוגמה לסריקה
#: nmap -A 192.168.1.1


ניתן לראות Ports פתוחים, מערכות ההפעלה, שמות  ברשת וכו'.
סריקה כזאת חושפת את התוקף כי היא משאירה חותמת מאוד ברורה במערכות הניתור של הקורבן.



ניתן לראות את הזמנים המאוד קצרים בין חבילה לחבילה שנשלחת מהתוקף.
ניתן לבצע סריקות יותר איטיות שלוקחות יותר זמן אבל מוסתרות יותר, האות T מייצגת את הזמן של הסריקה, כש 1 היא האיטית ביותר עד 5 שהיא המהירה ביותר.

#: nmap -T1 -A 192.168.1.103



ניתן לראות את שהזמנים יותר ארוכים בין חבילה לחבילה.


Zombie
שימוש במחשב "Zombie" שיבצע בשבילנו את הסריקה מבלי לחשוף את עצמנו, איך בדיוק זה עובד?
בתוך המושג Zombie מסתתרת בעייה עמוקה והיא ברמת ההתנהגות הבסיסית של הפרוטוקול Tcp/Ip , כל חבילה שנשלחת מכילה מספר רץ, בכל חבילה יש מספר שעולה + 1 כאשר מגיעה חבילה חדשה, ובעצם ע"פ הקפיצות ניתן לחזות אם ה Port פתוח או לא.

#: nmap -sI Zombie-Address -PN -v Victim-Address


הפעולה שמאחורי הקלעים:

שליחת Packet SYN/ACK ל Zombie


  • החבליה שחוזרת לנו מהזומבי היא RST ובעצם מעלה את ה ID באחד.


שליחת חבלית  Spoof  Packet SYN.

  • נשלחת דרכנו חבילה מטעם הזומבי.


הקןרבן מחזיר Packet SYN/ACK


  • מעלה את ה ID בזומבי ב 1.

שליחת Packet SYN/ACK נוסף ל Zombie



החבילה שחוזרת לנו חוזרת + 1 , כלומר אם ננתח את השיטה בחבילה הראשונה שנשלחה המספר ID עלה ב 1 כאשר אנחנו שולחים את החבילת ה Spoof שלנו ה Victim שולח חבילת SYN/ACK בעקבות הבקשה של SYN ששלחנו בחבילה, הזומבי מסרב לחבילה ומחזיר חבילת RST ומעלה את ה ID שלו ב 1  פעם נוספת כששולחים חבילה נוספת של SYN/ACK לזומבי מקבלים חבילה RST שמעלה את ה ID באחד ובעצם אם ה ID קפץ 3 פעמים ,המסקנה שה Port אצל ה Victim פתוח במקרה וחבילה החוזרת מה Zombie וה ID קפץ רק פעמיים זה אומר שה Port כנראה סגור כי חבילת ה Spoof לא הגיעה ליעד שלה.

ניתן לראות איך זה קורה בפועל מאחורי הקלעים:
#: nmap -sI Zombie-Address -PN -r --packet-trace -v Victim-Address 


 Httprint
כלי לזיהוי האפליקציה שמריצה את האתר, הכלי מאוד פשוט והוא עובד על ניתוח של החבילות שחוזרות, מגיע עם Backtrack, להורדה: http://net-square.com/httprint/


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


כיצד ניתן לבלבל את התוקפים?

FireWall
נחשוף לעולם כמה שפחות, הגדרות נכונות ב Firewall והסרה של שירותים שלא נחוצים למערכת שלנו.
Packet TTL
לשנות את זמני ה TTL שהמערכת מחזירה, כלומר ה Hops שיכולים לעבור ב Datagram שבחבילה, ובכל Hop  שאנחנו עוברים בדרך ה TTL קטן באחד, ברגע שאנו עוברים יותר Hops מהכמות המוגדרת ב TTL נקבל הודעת ICMP Time Exceeded, ב Windows הגדירו את ב TTL כ 128 וב Linux כ 64.

שינוי TTL ב Windows Server 2008
נפתח את ה RegEdit ונלך למפתח:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters


נוסיף Dword 32 bit נגדיר את ה TTL הרצוי, בין 1 - 255, חשוב לא להגדיר מספר נמוך מידי, נשמור אותו כ DefaultTTL



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


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



קבצי השגיאות מסוג Html והם ממוקמים בספרייה:
C:\inetpub\custerr\en-US\
ניתן לשנות את הניתוב עבור דפי השגיאות ברמת ה IIS ב Error Pages.


לסיכום:
איסוף המידע הוא קריטי עבור שלב ההתקפה, ובעצם כל חשיפה שיש על הקורבן מקרבת את התוקף לפריצה שהוא רוצה להפעיל - Exploits, DOS attack , Brute Force וכדומה.


יום שבת, 18 בדצמבר 2010

File Upload With Flex And IIS 7

העברת קבצים ב Flash זה עניין מסובך שמצריך הכנות ובדיקות, התהליך מורכב מ 3 שלבים , השלב הראשון הוא ההגדרות של המערכת: IIS,הרשאות כתיבה בספריות ופתיחת פורטים השלב הבא הוא פיתוח האתר שאיתו ה Flex הולך לדבר, ושלב אחרון הוא פיתוח מנגנון העלאה ב Flex.

הגדרות מערכת
תחילה יש להגדיר את גודל המידע שיכול לעבור ואח"כ את גודל כל דרישה בשביל אותו מידע , ב IIS7  גודל המידע ה Default הוא  30 מגה ,אבל ניתן לדרוס את הפרמטר הזה בקובץ ApplicationHost שהוא בעצם קובץ XML שמכיל את הפרמטרים של ה IIS, בזמן טעינת האתר ה IIS טוען את הקובץ ולאחר מכן הוא טוען את ה Web.Config שמכילים את הפרמטרים של האתר העצמו.

ApplicationHost.config
תחילה נערוך את קובץ
C:\Windows\System32\inetsrv\config\applicationHost.config

נחפש את הבלוק שמגדיר את האתר שלנו ב ApplicationHost  (חשוב מאוד לגבות את הקובץ!) :

<location path="Your Website Name">
        <system.webserver>
           <security>
                        <requestfiltering>
                        <requestlimits maxallowedcontentlength="104857600">
                        </requestfiltering>
          </security>
          </system.webserver>
</location>
 
ברוב המצבים תגית האתר כבר מוגדרת ויש לוודא שקיימת גם תגית ה Security ואם לא להוסיף אותה.
ניתן לעשות את התהליך גם ב AppCmd שהיא אפליקצית Console שמגיע עם ה IIS 7 וניתן בעזרת לערוך את קובץ ה ApplicationHost ללא צורך לפתוח אותו , ובעצם למנוע תקלות בעקבות כתיבה לא נכונה.
 
C:\Windows\System32\inetsrv>appcmd set config "Your Website Name" -section:requestFiltering -requestLimits.maxAllowedContentLength:104857600 -commitpath:apphost
 
maxAllowedContentLength:104857600 מגדיר גודל של המידע שניתן להעביר, במקרה שלנו הגדלנו אותו ל 100 MB.
 
Web.config
נוסיף את הבלוק הבא בתוך התגית <system.web>(חשוב מאוד לגבות את הקובץ!) :
<httpRuntime executionTimeout="90" maxRequestLength="4096" />

maxRequestLength=2097151 הגדרנו את גודל של בקשה, בעצם 2 מגה.

Asp.net

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

יש לנו 2 קבצי Asp.net באתר ,הראשון הוא ה Upload Handler שתוכנת ה Flex שלנו מתחברת על מנת לשלוח את הקובץ לשרת, ודף נוסף שמציג לנו את ה Uploader עצמו.

upload_handler.aspx.cs

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

 protected void Page_Load(object sender, EventArgs e)
{
       string fileName = System.IO.Path.GetFileName(Request.Files[i].FileName);
       Request.Files[i].SaveAs(Server.MapPath("~/UploadedFiles/") + fileName);
upload_manager.aspx
דף שמכיל לנו את אובייקט ה Flesh  שמעלה קבצים.
חשוב מאוד להגדיר Cross Domain Policy , שנוכל להעלות מכל שרת, או מרשתות שמורשות לכך.

Flex

אפליקצית ה Flex מורכבת ממספר פונקציות:
פונקצית Start
זאת הפוקציה שמתחילה את התוכנה ומוסיפה מאיזינים (listeners) עבור אירועים בכפתורים.

פונקצית eventRespnse
פותחת לנו את ה File Dialog שנוכל לבחור קבצים.

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

פונקצית UploadFiles
הפונקציה ששולחת את הקובץ לשרת, תחילה היא קוראת לקובץ upload_handler ואח"כ מתחילה בשליחת הקובץ.

פונקצית uploadComplete
כשהעלאת הקובץ מסתיימת, עולה לנו אירוע שאומר שאפשר לשלוח את הקובץ הבא.

Gui
הממשק מורכב מ - Button,Labels,Progress Bar


סרטון הדגמה:


קוד להורדה:

בהצלחה...

יום רביעי, 6 באוקטובר 2010

Bios Commands Limits IIS 7

כונן שיתופי עבור מספר אתרי אינטרנט  הוא דבר חיוני במיוחד שמדובר בשילוב של שרתים עם מערכת Storage מרכזית , קיימים מספר אתרים שיושבים על אותו Storage ומספר שרתי אירוח (IIS) שונים שמפוזרים על שרתים נפרדים אבל שיש להם חיבור עם אותו Storage , כשיש יותר מידי קריאות ל Storage או קריאות ארוכות בסיביבת Asp.net , האתר יראה לנו את ההודעה הבאה:
 The network BIOS command limit has been reached
כלומר שלא ניתן ליצור קשר עם ה Storage כי עדיין יש קריאות שלא הסתיימו מולו.

תחילה נראה שהבעיה כנראה ב Storage אבל מסתבר שדווקא בשרתי ה IIS שמבוססים על WINDOWS 7 שבברירת מחדל שלהם חסרים 2 מפתחות חשובים ב Registry ולכן לא ניתן ליצור יותר חיבורים עם ה Storage.

 שני המפתחות החסרים:

MaxCmds - DWORD 32 BIT
MaxMpxct - DWORD 32 BIT

יש להוסיף את המפתחות האלה תחת המפתח:

Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters


אבל עכשיו העניין איזה ערך להשים ב Value?? ובכן ה Default של 2 המפתחות הוא אמור להיות על 50, אבל אם צריך שתהיה אפשרות לבצע יותר קריאות ניתן להעלות אותו עד 65000 ב Decimal, אבל זה עלול לגרום למערכת לא להיות יציבה!! , עם אתם בעלי מערכת הפעלה 64 BIT אז אין בעיה להעלות אותו למקסימום אך עדיין זה לא מומלץ, הערך שאני השתמשתי הוא 800 כ HexDecimal או 2048 כ Decimal.

בהצלחה...

יום שלישי, 5 באוקטובר 2010

Multi Domain with default documents pointing to one website IIS 7

מסתבר שב IIS 7 יותר מסובך להגדיר Default Document לשני דומיינים שונים שמשתמשים באותו Web.config , ב IIS 6 האפשרות היתה יותר פשוטה , ה Default Document היה קשור ל Application Directory ולא היה לו קשר עם ההגדרות ב Web.config עצמו של האפליקציה ככה היה ניתן להגדיר ל 2 דומנים שונים שמצביעים על אותה תקייה עם 2 Default Document שונים.

כאשר ננסה לעשות הגדרה של 2 Default Document  ב IIS 7 ה Web.config השתנה לפי הדומיין שבחרנו באותו רגע, יש כמה שיטות לטפל בבעיה דרך URL Rewirte כחלק מה IIS 7 , הפניות ב JAVA SCRIPT כ REDIRECT או דרך עריכה של ה  Application Host שעליו אני ירחיב.

Application Host זה קובץ הממוקם בהגדרות של ה IIS, הוא ממוקם בספרייה:
C:\Windows\System32\inetsrv\config\applicationHost.Config

יש לפתוח את הקובץ (חשוב מאוד לגבות לפני תחילת התהליך!!):
יש להוסיף את בלוק למטה לפני <configuration/ > שסוגר את בלוק המרכזי של הקובץ.

<location path="your_site_name_in_the_iis">
        <system.webserver>
           <defaultdocument>
             <files>
                  <add value="my default document.aspx">
            </files>
          </defaultdocument>
        </system.webserver>
</location>

דרך נוספת לבצע את התהליך זה דרך ה Command Line - CMD:

%windir%\system32\inetsrv\appcmd.exe set config "[your site name in the iis]" -section:system.webServer/defaultDocument -+files.[value="my default document.aspx"] -commitpath:apphost

בהצלחה...

יום שני, 23 באוגוסט 2010

Cross Domain Policy

הנה עוד בעיה אבל הפעם מכיון של FLEX חברו הצעיר של ה FLASH מבית חברת ADOBE, הבעיה איך אני מגדיר 2 אתרים שונים שנמצאים תחת ה LOCALHOST ב IIS אבל מתקשרים אחד עם השני , לצורך העניין אתר אחד מציג את אפליקצית ה FLEX והשני הוא WEBSERVICE שמשרת את האפליקציית ה FLEX.

CROSS DOMAIN POLICY קיים מתחילת דרכו של ה FLASH לכן הנושא הזה חיי ובועט וניתן למצוא עליו חומר רב, בעקבות ה FLEX שונו חלק מהפרמטרים שהיו ב FLASH ופרמטרים חדשים נוספו.
 דוגמה מבין רבות


CROSS DOMAIN POLICY הוא בעצם קובץ XML שמכיל את ה DOMAIN שאליהם ניגש ה FLEX.

הקובץ במקרה שלנו ממוקם בספריית ה ROOT של ה IIS.

דוגמה:



<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM
"http://www.adobe.com/xml/dtds/cross-domain-policy.dtd" >
<cross-domain-policy>
<site-control permitted-cross-domain-policies="all">
<allow-access-from domain="*" secure="false">
< allow-http-request-headers-from domain="*" headers="*" secure="false">
< /cross-domain-policy>

ה * מסמנת שיש הרשאה לכל ה DOMAIN שמעוניינים לגשת מאפליקצית ה FLEX , אם זאת כתובת ספציפית יש להחליף את ה * בכתובת.

כמו שאמרתי ה DEFUALT של הקובץ נמצא ב ROOT , אבל אם ה WEBSERVICE שלנו היה נמצא בשרת אחר ההינו צריכים למקם אותו עם ה WEBSERVICE ,בעצם האפליקציית FLEX מחפשת את ה CROSSDOMAIN.XML ב DOMAIN שאליו היא מתחברת, כלומר הקובץ צריך להכיל את הכתובת של ה DOMAIN שממנו האפליקציית ה FLEX מופעלת על מנת שתהיה מאושרת לקבל נתונים מה WEBSERVICE.

 ניתן לבקש מהאפליקציה לקרוא לקובץ שבכלל נמצא בשרת אחר ע"י הוספת שורת קוד בתוך ה FLEX

Security.loadPolicyFile(http://mysite.com/crossdomain.xml);

בהצלחה...

יום חמישי, 12 באוגוסט 2010

Framework 1.1 and IIS 7 and Windows 7

מיקרוסופט מנסים להרוג את ה FRAMEWORK 1.1 וגם פוזלים לכיוון של 2 , החיים נהיו יותר קשים בלהגדיר על שרתים חדשים WINDOWS SERVER 2008 אפליקציות "ישנות" שמבוססות על FRAMEWORK ישנים.

המגבלות של FRAMEWORK 1.1 שהוא תומך רק במערכות 32 BIT , ולכן יש לבצע שינויים רבים על מנת להפעיל אותו על השרת.

שלב א:

דבר ראשון יש לדאוג להתקין CGI על השרת:

Server Manager -->Roles-->Add Role Service

לבחור ב FEATURE - CGI


יש להוסיף גם את ה METABASE שאיתו עובד FRAMEWORK 1.1
יש לסמן בנוסף את
 IIS6 Managment tools -->IIS 6 managment compatbility --> IIS 6 Metabase Comptability

שלב ב:
התקנת ה Framework
יש להוריד את ה Framework ועדכוני אבטחה:

נתינת הרשאות גבוהות עבור האפליקציה היא שלב קריטי ביותר

עדכון FULL TRUST של האפליקציה:

Administrative tool - .Net Framework 1.1 configuration



לחיצה על Adjust Zone Security מקפיצה Wizard בו 2 אפשריות עדכון עבור המחשב הזה או עבור משתמש,
לאחר סימון אחת מהאפשרויות התאפשר לנו לשנות כיצד התוכנה תגיב ע"י שימוש של משתמש,רשת פנימית וחיצונית - אינטרנט.



ניתן להשתמש במקום ב Microsoft.net framework 1.1 wizard שנמצא ב Administrative tool

יש להריץ את הפקודות הבאות ב CMD

הפעלה של ה Framework
C:\Microsoft.NET\Framework\v1.1.4322\>aspnet_regiis -enable

התקנת סקריפטים
C:\Microsoft.NET\Framework\v1.1.4322\>aspnet_regiis -c

צריכים לערוך גם את קובץ ה CONFIG של ה FRAMEWORK
ניתן למצוא את הקובץ בספריה:

C:\Microsoft.NET\Framework\v1.1.4322\Config\Machine.config

יש לערוך אותו ולהוסיף את השורה למטה בסוף התגית - configSections


<section name="system.webServer" type="System.Configuration.IgnoreSectionHandler,
    System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
</configSections>

מערכות 64 BIT לא מזהות את ה Framework בגלל שהוא תוכנן ל 32 BIT לכן נעשה פה טריק קטן:
ניצור ספריה חדשה ב

C:\Microsoft.NET\Framework64\v1.1.4322\Config\

נעתיק את כל מה שנמצא בספריה המקבילה של ה 32 BIT.

שלב ג:
הוספת ה Framework ל IIS

נפתח את ה IIS נסמן את ה NODE של ה LOCALHOST
נלחץ על FEATURE VIEW ונסמן את ISAPI and CGI Restrictions , נלחץ על ADD



נבחר את הקובץ

C:\Windows\Microsoft.Net\Framework\v1.1.4322\aspnet_isapi.dll
ו Restriction נסמן כ Allowed.

יש לבנות Appliction Pool שמבוסס על Asp.net v.1.1 וללחוץ על Advanced Settings
צריך לשנות את הפרמטר Enable 32-bit applications = true

משנשאר זה להוסיף את האתר ל Application Pool

בהצלחה.

יום שני, 9 באוגוסט 2010

Required permissions cannot be acquired. / Failed to grant minimum permission requests

התקלה הזאת מתרחשת כאשר רצים קבצים באתר (DLL וכו') שאינם נחשבים כ FULL TRUST , במערכת ב .net , שמשתמשת ה ASP.

לאחר שהגדרתי את האתר ב IIS 7 ניסיתי להריץ אותו ב LOCALHOST אבל קיבלתי הודעה כזאת:.


Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.




Exception Details: System.Security.Policy.PolicyException: Required permissions cannot be acquired.


Source Error:
An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.
Stack Trace:


[PolicyException: Required permissions cannot be acquired.]


System.Security.SecurityManager.ResolvePolicy(Evidence evidence, PermissionSet reqdPset, PermissionSet optPset, PermissionSet denyPset, PermissionSet& denied, Boolean checkExecutionPermission) +2770052


System.Security.SecurityManager.ResolvePolicy(Evidence evidence, PermissionSet reqdPset, PermissionSet optPset, PermissionSet denyPset, PermissionSet& denied, Int32& securitySpecialFlags, Boolean checkExecutionPermission) +57
[FileLoadException: Could not load file or assembly 'Infragistics2.WebUI.UltraWebListbar.v6.3, Version=6.3.20063.53, Culture=neutral, PublicKeyToken=7dd5c3163f2cd0cb' or one of its dependencies. Failed to grant minimum permission requests. (Exception from HRESULT: 0x80131417)]


System.Reflection.Assembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection) +0


System.Reflection.Assembly.nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection) +54


System.Reflection.Assembly.InternalLoad(AssemblyName assemblyRef, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection) +211


System.Reflection.Assembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection) +141


System.Reflection.Assembly.Load(String assemblyString) +25


System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String assemblyName, Boolean starDirective) +32
[ConfigurationErrorsException: Could not load file or assembly 'Infragistics2.WebUI.UltraWebListbar.v6.3, Version=6.3.20063.53, Culture=neutral, PublicKeyToken=7dd5c3163f2cd0cb' or one of its dependencies. Failed to grant minimum permission requests. (Exception from HRESULT: 0x80131417)]


System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String assemblyName, Boolean starDirective) +596


System.Web.Configuration.CompilationSection.LoadAllAssembliesFromAppDomainBinDirectory() +211


System.Web.Configuration.CompilationSection.LoadAssembly(AssemblyInfo ai) +46


System.Web.Compilation.BuildManager.GetReferencedAssemblies(CompilationSection compConfig) +177


System.Web.Compilation.BuildProvidersCompiler..ctor(VirtualPath configPath, Boolean supportLocalization, String outputAssemblyName) +185


System.Web.Compilation.CodeDirectoryCompiler.GetCodeDirectoryAssembly(VirtualPath virtualDir, CodeDirectoryType dirType, String assemblyName, StringSet excludedSubdirectories, Boolean isDirectoryAllowed) +350


System.Web.Compilation.BuildManager.CompileCodeDirectory(VirtualPath virtualDir, CodeDirectoryType dirType, String assemblyName, StringSet excludedSubdirectories) +125


System.Web.Compilation.BuildManager.CompileCodeDirectories() +525


System.Web.Compilation.BuildManager.EnsureTopLevelFilesCompiled() +448
[HttpException (0x80004005): Could not load file or assembly 'Infragistics2.WebUI.UltraWebListbar.v6.3, Version=6.3.20063.53, Culture=neutral, PublicKeyToken=7dd5c3163f2cd0cb' or one of its dependencies. Failed to grant minimum permission requests. (Exception from HRESULT: 0x80131417)]


System.Web.Compilation.BuildManager.ReportTopLevelCompilationException() +57


System.Web.Compilation.BuildManager.EnsureTopLevelFilesCompiled() +612


System.Web.Hosting.HostingEnvironment.Initialize(ApplicationManager appManager, IApplicationHost appHost, IConfigMapPathFactory configMapPathFactory, HostingEnvironmentParameters hostingParameters) +644
[HttpException (0x80004005): Could not load file or assembly 'Infragistics2.WebUI.UltraWebListbar.v6.3, Version=6.3.20063.53, Culture=neutral, PublicKeyToken=7dd5c3163f2cd0cb' or one of its dependencies. Failed to grant minimum permission requests. (Exception from HRESULT: 0x80131417)]


System.Web.HttpRuntime.FirstRequestInit(HttpContext context) +3465427


System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context) +69


System.Web.HttpRuntime.ProcessRequestInternal(HttpWorkerRequest wr) +279



מסתבר של .NET יש הרשאות משלו במיוחד שמדובר על FRAMEWORK 2 , הוא לא מתייחס בכלל להרשאות שמוגדרות ב IIS 7.

אז איך מתקנים את זה:
ב WINDOWS 7 נראה כאילו שלא קיים FRAMEWORK 2 וה DEFAULT הוא 3.5, אם במקרה אתם רוצים להתקין אתר שבנוי ב FRAMEWORK 2 תצטרכו להוריד את ה .net framework 2.0 configuraton שנמצא בחבילת ה SDK
של framework 2.0
לאתר מיקרוספט

הכלי נמצא
 CONTROL PANEL -->ADMINISTRATOR TOOLS -->.NET FRAMEWOR 2.0 CONFIGURATION


תחילה נבחר ב RUNTIME SECURITY POLICY ונבחר ב ADJUST ZONE SECURITY


ניתן להגדיר הגדרות אבטחה עבור משתמש או עבור כל המכונה.


ונסמן את האפשרות של FULL TRUST

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

יום שני, 26 ביולי 2010

שינוי משתמש ASPNET למשתמש אחר - IIS



שינוי המשתמש ה DEFAULT של IIS הוא ASPNET , ברוב המקרים הוא עושה את העבודה אבל במקרים מסויימים נרצה שמשתמש אחר יפעיל את האתר ב IIS, לדוגמה: הפעלת קבצים בעלי הרשאות גבוהות, גם במקרים אלו ה ASPNET מבצע את העבודה.

רציתי להפעיל תוכנה חיצונית של ADOBE ישירות מהאתר, מסתבר שהתוכנה רושמת נתונים בספרייה של ה USER ב DOCUMENTS AND SETTINGS וברגע ש USER אחר מפעיל את התוכנה הוא לא עובדת כמו שהיא תוכננה לעבוד עם ה USER שהתקין את התוכנה, אז מה עושים?

ב IIS 6 ניתן לשנות את ה USER שמוגדר ב IIS.

1.יש לבנות APPLICATION POOL נפרד עבור האתר.

2.יש ללחוץ על ה PROPERTIES של ה APPLICATION POOL

3.יש לבחור בלשונית IDENTITY לסמן את האפשרות CONFIGURABLE, יש להכניס את השם משתמש החדש והסיסמא ובפעם הבאה שיפעילו את האפליקציה היא תרוץ תחת השם המשתמש הנבחר.