تم الكتابة في جمادى الثانية 29, 1429 02:15

بسم الله الرحمن الرحيم ...

السلام عليكم ورحمة الله وبركاته ...

 تطرقنا في الدوينة الماضية إلى الدرس الأول: إنشاء قاعدة بيانات Membership و Role في ASP.NET و اليوم سوف نتطرق إن شاء الله إلى كيفية تعريف الـ Roles و Members في ASP.NET.

في البداية يفترض أنك قمت بانشاء قاعدة البيانات التي سوف نستخدمها كما فعلنا في الدرس السابق الدرس الأول: إنشاء قاعدة بيانات Membership و Role في ASP.NET.

الآن افتح الفجول ستديو 2005 أو 2008 أيهما تشاء ... أنا سوف استخدم النسخة 2005.

الآن انشئ موقع ويب جديد كما في الصورة:

 

اختر اسم الموقع و لغة البرمجة التي سوف تستخدمها، أنا سوف اختار اسم "MyMembershipSite" و سوف اختار لغة سي# في هذا الدرس كما في الصورة:

 

اضغط على الصورة لتكبيرها

 

ثم اضغط على OK ثم اختر View ثم Solution Explorer إذا لم يكن ظاهراً لديك.

بعد ذلك، بزر الفأرة الأيمن اضغط على الـ Solution ثم Add New Item كما في الصورة:

 

ثم من النافذة اختر Web Configration File ثم Add و لا تغير شيء كما في الصورة:

 

اضغط على الصورة لتكبيرها

 

الآن نحتاج أن نضيف ConnectionString إلى قاعدة البيانات التي انشئناها في الدرس الأول.

نضيف الكود التالي داخل Web.Config:

<add name="MyNewDBConnectionString" connectionString="Data Source=[Server];Initial Catalog=MyNewDB;Integrated Security=True" />

و استبدل [server] باسم الجهاز الذي يوجد فيه قاعدة البيانات. و هذا الكود يخبر ASP.NET بأن قاعدة بياناتنا موجودة في الجهاز [server] و سوف نستخدم قاعدة البيانات التي اسمها MyNewDB و سوف نستخدم توثيق وندوز.

و بعد ذلك في System.Web اكتب الكود التالي:

<membership defaultProvider="CustomizedProvider">
    <providers>
 <add name="CustomizedProvider"
       type="System.Web.Security.SqlMembershipProvider"
      connectionStringName="MyNewDBConnectionString"
      applicationName="MyMembershipSite"
      minRequiredPasswordLength="5"
      minRequiredNonalphanumericCharacters="0" />
    </providers>
</membership>


<roleManager enabled="true" defaultProvider="CustomizedRoleProvider">
        <providers>
          <add name="CustomizedRoleProvider"
               type="System.Web.Security.SqlRoleProvider"
               connectionStringName="MyNewDBConnectionString" />
        </providers>
</roleManager>

و هذا الكود يخبر ASP.NET بأننا سوف نستخدم مزود للـ Membership و الذي هو SqlMembership (اي يخزن و يقرأ من SQL) و أخبرناه عن طريق الـ ConnectionString بمكان قاعدة البيانات.  و كذلك الحال بالنسة للـ RoleManager.

و لاحظ أننا كتبنا اسم التطبيق و هذا مهم للغاية لكي لا يحدث لك مشاكل أثناء نشر Deploy الموقع. و لاحظ اننا حددنا بعض القيود و الشروط على كلمة السر، فجعلنا أنه لابد لمستخدمي النظام من استخدام كلمة سر بطول خمسة حروف على الأقل و من الممكن أن تغيرها إلى ما تشاء.

الآن شكل Web.config كالتالي:

 و من الممكن تحميل ملف Web.Config من الرابط في الاسفل و ذلك للتأكد من الخصائص لديك ...

Web.config (2.53 kb)

 

بعد ذلك اضغط على رز ASP.NET Configration كما هو موجود في المربع الاحمر في الصورة أدناه أو اذهب إلى WebSite ثم ASP.NET Configration .

الآن سوف تفتح لك نافذة Internet Explorer مثل هذه:

 

اضغط على الصورة لتكبيرها

 

الآن اذهب إلى الTab العلوي Security كما في الصورة:

 

الآن التوثيق المستخدم في النظام (و ليس قاعدة البيانات) هو وندوز، و نريد ان نغيره إلى Form و يمكننا ذلك عن طريق تعديل Web.Config مباشرة أو الذهاب إلى Select Authentication Type كما في الصورة:

 

ثم اختر الاختيار الأول From the Internet كما في الصورة:

و عندما يتم التغيير و عندما تذهب إلى ملف Web.Config سوف تجد رسالة تشبه هذه:

 

اضغط على الصورة لتكبيرها

 

و هي تفيد بأنه تم تغيير في ملف web.config، ببساطة اضغط على Yes to All. و هذا لأن ASP.NET Web Admin Tool قام بعمل تغيير على web.config عندما غيرنا توثيق ASP.NET إلى Form بدلاً من Windows.

 

و الآن من المفترض أن يكون الشكل كالتالي:

 

اضغط على الصورة لتكبيرها

 

ثم بعد ذلك لنقوم بإنشاء عدد 2 Role و احدة للـ Admin و الأخرى Users. و ذلك عن طريق الضغط على Create or Manage Roles.

ثم ادخل اسم Role و اضغط على Add كما في الصورة:

و بنفس الطريقة اضف Role اخرى باسم UserRole.

و الآن لدينا 2 Role و 0 User.

و على سبيل التجربة اضف عدد 3 مستخدمين عن طريق الرابط Create User. و اجعل واحد باسم Admin في AdminRole و الآخر User في الـ UserRole و الثالث AnyUser و لا تجعله ضمن أي Role كما في الصورة:

اضغط على الصورة لتكبيرها

 

و بعد اضافة الثلاثة مستخدمين سيكون الشكل كالتالي:

 

و في النهاية لو ذهبت إلى قاعدة البيانات عن طريق الـ MS Sql Server Managment Studio  و ذهب إلى قاعدة البيانات MyNewDB و ذهبت إلى الجدول aspnet_Users على سبيل المثال سوف تجد المستخدمين اللذين أضفتهم و كذلك الجدول aspnet_Roles.

 

في الدرس القادم سوف ندخل بشكل أعمق في ASP.NET و استخدام الـ Login Controls و سوف نرى أيضاً كيف يمكننا تحديد صلاحيات على مستوى الصفحة و على مستوى المجلد أيضاً.

 

مع تحياتي ... طلال الحضبي.

Del.icio.usDigg It!DZone It!Reddit


تم الكتابة في جمادى الأولى 26, 1429 22:44

  

السلام عليكم ورحمة الله وبركاته ...

 وقعت بالصدفة قبل فترة على موقع VistaDB و الحقيقة فوجئت لما وجدت داخله ...

أولاً: ما هو VistaDB ؟

VistaDB هي قاعدة بيانات SQL ... مصممة خصيصاً لمطوري بيئة الدوت نت NET. تعمل على الـ Microsoft .NET Framework و على Compact Framework الخاصة بالأجهزة الكفية و على Mono على لينكس.

 

 

ثانياًُ: ماذا يميز VistaDB ؟

طبعاً من تعريف VistaDB السابق، نجد انها لم تقدم شيء جديد!! و لكن VistaDB هي قاعدة بيانات خفيفة جداً صغيرة الحجم (أقل من 1 ميقا). و هي ملف DLL واحد فقط. أي ان محرك قواعد البيانات ليس EXE و لكنه ملف DLL واحد فقط تستطيع إدراجه في مشروعك و هو كما قلت أقل من وحد ميقا.

و ما يميز VistaDB أيضاً هو ان قواعد البيانات الخاصة بها هي أيضاً ملف واحد و لا يوجد Log file و Data file و لكن يوجد ملف واحد امتداده VDB3. و تستطيع عمل نسخة إحتياطية لقاعدة بيانات بأمر XCopy أو نسخ الملف الموجود فقط و تستطيع استرجاع قاعدة البيانات بلصق الملف فقط.

VistaDB تستطيع تحمل حجم 4 تيرابايت لكل قاعدة بيانات. و 65,535 جدول لكل قاعدة بيانات و 65,535 عمود لكل جدول و 65,535 Index لكل جدول أيضاً.

تدعم VistaDB النسخة الثالثة SQL-99 و لمزيد من المعلومات عن ذلك يمكنك زيارة الموقع هنا.

كما أن VistaDB تدعم Unicode و ذلك لكتابة باللغة العربية على سبيل المثال.

تستطيع التعامل مع VistaDB عن طريق T-SQL بنفس الطريقة مع MS SQL Server 2005 و تستطيع استخدام CLR باستخدام السي# أو VB.net.

يوجد منها نسخة Exress مجانية و لمزيد من المعلومات عنها تفضل هنا.

كما أن VistaDB مطورة بالكامل باستخدام #C.

و توجد عدد من الأدوات للتطوير باستخدام VistaDB مثل Data Migration Wizard و ذلك لنقل بياناتك من MS Access أو MS SQL Server إلى VistaDB .

كما يوجد Data Builder و التي تعطيك شاشات للتعامل مع قواعد بيانات داخل VistaDB حيث تستطيع إنشاء أو تعديل او حذف جدول كما تستطيع انشاء indexes, triggers, constraints, columns. و تسطيع عمل database encryption من خلالها.

كما انه لا يوجد حد لعدد CPU أو RAM الذي يدعمها.

 

ثالثاً: كيف تعمل VistaDB ؟

كما قلت سابقاً، محرك قواعد بيانات VistaDB هو ملف DLL واحد فقط، و قاعدة البيانات هي عبارة عن ملف VDB3 واحد. و باستخدام اداة مثل ILMerge تستطيع ان تضمن ملف DLL داخل ملف EXE الخاص ببرنامج.

و الشكل أدناه يبين آلية عمل VistaDB و  البرنامج الذي تبنيه. كما يبين الشكل ان VistaDB ستكون جزءً من البرنامج أو الموقع الذي تبنيه.

 

 

 

و عند ذلك لا داعي أن نحمل محرك قواعد البيانات مثلاً MS SQL Server 2005 في جهاز العميل الذي يستخدم الموقع أو البرنامج. كما أنه عند البحث عن مستضيف موقعك الشخصي لن تقلق إذا كان يدعم MS SQL Server أم لا فكل ما تحتاجه هو NET. فقط لكي تعمل VistaDB .

 

اتمنى أن يكون طرحي مفيداً و موفقاً و سوف اختبر المنتج و أبدي لكم رأيي فيه متى ما سمحت الفرصة.

 

 ولمزيد من المعلومات يمكنكم زيارة الموقع الرسمي http://www.vistadb.net/

 

مع تحياتي ,,, طلال الحضبي.

Del.icio.usDigg It!DZone It!Reddit


تم الكتابة في محرم 30, 1429 02:50

 

السلام عليكم و رحمة الله وبركاته ...

كنت قد وعدتكم في هذا المقال بكتابة درس عن كيف تستخدم CAPTCHA في ASP.NET.

اليوم سوف أتطرق لهذا في هذه السطور القادمة.

ملاحظة: الموضوع الأصلي موجود في موقع Code Project في هذه الصفحة  و منقول بتصرف.

في البداية أنشئ صفحة و لنسميها Default.aspx و لنضع فيها:

  • Image اسمها Image1
  • TextBox اسمها TextBox1
  • Label اسمه Label1
  • Button اسمه Button1

و لنضع هذا الكود بداخل ملف Default.aspx.cs:

using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;

public partial class _Default : System.Web.UI.Page
{
    // For generating random numbers.
    private Random random = new Random();

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            // Create a random code and store it in the Session object.
            Session["CaptchaImageText"] = GenerateRandomCode();
        }
        else
        {
            // On a postback, check the user input.
            if (TextBox1.Text == Session["CaptchaImageText"].ToString())
            {
                // Display an informational message.
                Label1.CssClass = "info";
                Label1.Text = "Correct!";
            }
            else
            {
                // Display an error message.
                Label1.CssClass = "error";
                Label1.Text = "ERROR: Incorrect, try again.";

                // Clear the input and create a new random code.
                TextBox1.Text = "";
                Session["CaptchaImageText"] = GenerateRandomCode();
            }
        }
    }

    //
    // Returns a string of six random digits.
    //
    private string GenerateRandomCode()
    {
        string s = "";
        for (int i = 0; i < 6; i++)
            s = String.Concat(s, this.random.Next(10).ToString());
        return s;
    }
}

 

في هذا الكود قمنا بانشاء رقم عشوائي و حفظة في Session اسمها CaptchImageText و تتغير كلما عملنا PageRefrsh

الآن للنشئ صفحة اسمها JpegImage.aspx و نضع الكود التالي في الملف JpegImage.aspx.cs

protected void Page_Load(object sender, EventArgs e)
{
        // Create a CAPTCHA image using the text stored in the Session object.
        CaptchaImage ci = new CaptchaImage(this.Session["CaptchaImageText"].ToString(), 200, 50, "Century Schoolbook");

        // Change the response headers to output a JPEG image.
        this.Response.Clear();
        this.Response.ContentType = "image/jpeg";

        // Write the image to the response stream in JPEG format.
        ci.Image.Save(this.Response.OutputStream, ImageFormat.Jpeg);

        // Dispose of the CAPTCHA image object.
        ci.Dispose();
}

هنا سوف نقوم بأنشاء الصورة و سيكون محتواها هو ما هو موجود في الـ Session التي أنشأناها في الصفحة Default.aspx ثم سوف نجعل هذه الصفحة تنتج ملف Jpeg بدلاً من HTML.

الآن في الصفحة Default.aspx نختار Image1 و نذهب للخصائص Properties و نضع القيمة ImageUrl تساوي الصفحة التي قمنا بإنشائها JpegImage.aspx.

 

الآن و المرحلة الأخيره هي انشاء كلاس Class اسمه CaptchaImage.cs ( و هي المسؤولة عن انشاء الصورة و تشويهها  عمل Noise للخلفيه) و نضع فيه الكود التالي:

using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.Drawing.Text;

/// <summary>
/// Summary description for CaptchaImage
/// </summary>
public class CaptchaImage
{
    // Public properties (all read-only).
    public string Text
    {
        get { return this.text; }
    }
    public Bitmap Image
    {
        get { return this.image; }
    }
    public int Width
    {
        get { return this.width; }
    }
    public int Height
    {
        get { return this.height; }
    }

    // Internal properties.
    private string text;
    private int width;
    private int height;
    private string familyName;
    private Bitmap image;

    // For generating random numbers.
    private Random random = new Random();

    // ====================================================================
    // Initializes a new instance of the CaptchaImage class using the
    // specified text, width and height.
    // ====================================================================
    public CaptchaImage(string s, int width, int height)
    {
        this.text = s;
        this.SetDimensions(width, height);
        this.GenerateImage();
    }

    // ====================================================================
    // Initializes a new instance of the CaptchaImage class using the
    // specified text, width, height and font family.
    // ====================================================================
    public CaptchaImage(string s, int width, int height, string familyName)
    {
        this.text = s;
        this.SetDimensions(width, height);
        this.SetFamilyName(familyName);
        this.GenerateImage();
    }

    // ====================================================================
    // This member overrides Object.Finalize.
    // ====================================================================
    ~CaptchaImage()
    {
        Dispose(false);
    }

    // ====================================================================
    // Releases all resources used by this object.
    // ====================================================================
    public void Dispose()
    {
        GC.SuppressFinalize(this);
        this.Dispose(true);
    }

    // ====================================================================
    // Custom Dispose method to clean up unmanaged resources.
    // ====================================================================
    protected virtual void Dispose(bool disposing)
    {
        if (disposing)
            // Dispose of the bitmap.
            this.image.Dispose();
    }

    // ====================================================================
    // Sets the image width and height.
    // ====================================================================
    private void SetDimensions(int width, int height)
    {
        // Check the width and height.
        if (width <= 0)
            throw new ArgumentOutOfRangeException("width", width, "Argument out of range, must be greater than zero.");
        if (height <= 0)
            throw new ArgumentOutOfRangeException("height", height, "Argument out of range, must be greater than zero.");
        this.width = width;
        this.height = height;
    }

    // ====================================================================
    // Sets the font used for the image text.
    // ====================================================================
    private void SetFamilyName(string familyName)
    {
        // If the named font is not installed, default to a system font.
        try
        {
            Font font = new Font(this.familyName, 12F);
            this.familyName = familyName;
            font.Dispose();
        }
        catch (Exception ex)
        {
            this.familyName = System.Drawing.FontFamily.GenericSerif.Name;
        }
    }

    // ====================================================================
    // Creates the bitmap image.
    // ====================================================================
    private void GenerateImage()
    {
        // Create a new 32-bit bitmap image.
        Bitmap bitmap = new Bitmap(this.width, this.height, PixelFormat.Format32bppArgb);

        // Create a graphics object for drawing.
        Graphics g = Graphics.FromImage(bitmap);
        g.SmoothingMode = SmoothingMode.AntiAlias;
        Rectangle rect = new Rectangle(0, 0, this.width, this.height);

        // Fill in the background.
        HatchBrush hatchBrush = new HatchBrush(HatchStyle.SmallConfetti, Color.LightGray, Color.White);
        g.FillRectangle(hatchBrush, rect);

        // Set up the text font.
        SizeF size;
        float fontSize = rect.Height + 1;
        Font font;
        // Adjust the font size until the text fits within the image.
        do
        {
            fontSize--;
            font = new Font(this.familyName, fontSize, FontStyle.Bold);
            size = g.MeasureString(this.text, font);
        } while (size.Width > rect.Width);

        // Set up the text format.
        StringFormat format = new StringFormat();
        format.Alignment = StringAlignment.Center;
        format.LineAlignment = StringAlignment.Center;

        // Create a path using the text and warp it randomly.
        GraphicsPath path = new GraphicsPath();
        path.AddString(this.text, font.FontFamily, (int)font.Style, font.Size, rect, format);
        float v = 4F;
        PointF[] points =
   {
    new PointF(this.random.Next(rect.Width) / v, this.random.Next(rect.Height) / v),
    new PointF(rect.Width - this.random.Next(rect.Width) / v, this.random.Next(rect.Height) / v),
    new PointF(this.random.Next(rect.Width) / v, rect.Height - this.random.Next(rect.Height) / v),
    new PointF(rect.Width - this.random.Next(rect.Width) / v, rect.Height - this.random.Next(rect.Height) / v)
   };
        Matrix matrix = new Matrix();
        matrix.Translate(0F, 0F);
        path.Warp(points, rect, matrix, WarpMode.Perspective, 0F);

        // Draw the text.
        hatchBrush = new HatchBrush(HatchStyle.LargeConfetti, Color.LightGray, Color.DarkGray);
        g.FillPath(hatchBrush, path);

        // Add some random noise.
        int m = Math.Max(rect.Width, rect.Height);
        for (int i = 0; i < (int)(rect.Width * rect.Height / 30F); i++)
        {
            int x = this.random.Next(rect.Width);
            int y = this.random.Next(rect.Height);
            int w = this.random.Next(m / 50);
            int h = this.random.Next(m / 50);
            g.FillEllipse(hatchBrush, x, y, w, h);
        }

        // Clean up.
        font.Dispose();
        hatchBrush.Dispose();
        g.Dispose();

        // Set the image.
        this.image = bitmap;
    }
}

الآن نفذ البرنامج و كل شيئ من المفترض أن يعمل بشكل جيد كما في الشكل الموجود في أعلى الموضوع.

و يمكنك تحميل المشروع كاملاً من هنا:

captcha.zip (4.42 kb)

أحب أن انوه أن هذا المثال ينتج CAPTCHA بسيطة جداً تتكون من أرقام فقط، و الكود لإنتاج الأرقام موجود و من الممكن أن تغير فيها لكي ينتج ارقام و حروف أو حتى كلمات.

من الممكن بقليل من البحث في Google الوصول إلى User Controls جاهزة تقوم بالعمل كله و بشكل احترافي و مجاني.

 

أتمنى لكم التوفيق...

طلال السبيعي.

Del.icio.usDigg It!DZone It!Reddit

التصنيف: .NET , ASP.NET , C# , أمن المعلومات
البطاقات: ,

تم الكتابة في محرم 25, 1429 09:10

السلام عليكم ورحمة الله وبركاته ...

 

اطلق قبل فترة الفجول ستديو Visual Studio.net 2008 . و أطلق معها النسخة الجديدة من لغة C# 3.0.

توجد تطويرات كثيرة في هذه النسخة و سوف اتحدث عنها في عدة مواضيع إن شاء الله تعالى.

اليوم سوف أتكلم عن التعريف الضمني للمتغيرات أو الـ Implicitly Typed Local Variables.

في السابق كنا لابد ان نحدد نوع المتغير عندما نريد استخدامه في لغة سي# ، مثل الطريقة التالية:

int i = 5;
string s = "Hello";
double d = 1.0;

فالكود أعلاه قمنا بتعريف متغير من نوع int و آخر من نوع string و آخر من نوع double و لكن الكود التالي يعتبر ايضاً صحيح في لغة سي# 3.0.

var i = 5;
var s = "Hello";
var d = 1.0;

فالمتغير الأول i سيكون من نوع int لأننا اسندنا له القيمة 5 و الثاني s سيكون عبارة عن string لأننا اسندنا له قيمة string و هكذا لأننا قمنا بتعريفها من نوع var.

و عندما يعرف متغير من نوع var و تسند له قيمة int لا نستطيع اسناد string له مثلاً فيما بعد، مثل هذا المثال:

var i = 5;
i = "Hello";     // Error, can't assign string to int

فلغة سي# 3.0 أصبحت ذكية بالإمكان للتعرف على نوع المتغير عن طريق الجهة اليمنى للجملة Right Hand Side .

و لاستخدام هذه الطريقة في لغة سي# 3.0 لابد من توفر الشروط التاليه:

  • عند استخدام متغير من نوع var لابد من اسناد قيمة ابتدائية له.
  • القيمة الابتدائية لابد ان تكون تعبير رياضي.
  • لا يمكن ان تكون القيمة الابتدائية null.
  • لا يمكن تعريف اكثر من متغير في نفس الجملة.
  • لا يمكن للمتغير ان ينسد إلى نفسه.

لذلك الأمثلة التالية ليست صحيحة:

var x;               // Error, no initializer to infer type from
var y = {1, 2, 3};   // Error, collection initializer not permitted
var z = null;        // Error, null type not permitted
var u = x => x + 1;  // Error, lambda expressions do not have a type
var v = v++;         // Error, initializer cannot refer to variable itself

 

و لمزيد من التفاصيل يمكنك زيارة الموقع الرسمي للـMSDN.

مع تحياتي ...

Del.icio.usDigg It!DZone It!Reddit

التصنيف: .NET , ASP.NET , C#
البطاقات: ,

 

بسم الله الرحمن الرحيم ...

 من الأمور المهمة في لغة ASP.NET 2.0 ملف الـ Web.Config و الذي يقوم بتخزين التعريفات المهمة لتطبيق الويب.

و من أشهر و أهم المعلومات التي تخزن فيه هي الـ ConnectionString و التي يخزن بداخلها اسم المستخدم و كلمة مرور قواعد البيانات و عنوان سيفر قاعدة البيانات. كما أنه من الأمور المهمة التي تخزن في ملف الـ Web.Config معلومات الـ SMTP Server.

و بالرغم من أن الـ ASP.NET يتكفل بحماية ملف الـ Web.Config و لكن ماذا لو نسينا أن تغلق وصول الـ anonymous للـ FTP مثلاً؟!! سوف يصل بشكل مباشر إلى الـ Web.Config و يقرأه عن طريق الـ Notepad و سوف يجد جميع معلوماتنا الفيمة بداخله.

لذلك كان من أفضل التطبيقات في حماية ملف Web.Config هو تشفير الأجزاء المهمه.

 

سوف ننشئ الـ Methods التالية لتشفير و فك تشفير هذه الاجزاء بلغة السي#.

private void ProtectSection(string sectionName, string provider)
    {  
        Configuration config =
            WebConfigurationManager.
                OpenWebConfiguration(Request.ApplicationPath); 

        ConfigurationSection section =
                     config.GetSection(sectionName);

        if (section != null &&
                  !section.SectionInformation.IsProtected)
        {
            section.SectionInformation.ProtectSection(provider);
            config.Save();
        }
    }

    private void UnProtectSection(string sectionName)
    {
        Configuration config =
            WebConfigurationManager.
                OpenWebConfiguration(Request.ApplicationPath);

        ConfigurationSection section =
                  config.GetSection(sectionName);

        if (section != null &&
              section.SectionInformation.IsProtected)
        {
            section.SectionInformation.UnprotectSection();
            config.Save();
        }
    }

في الدالة ProtectSection تأخذ هذه الدالة قيمتين هي sectionName و provider.

الـ sectionName تأخذ القسم المراد تشفيره مثلاً "appSettings" و المتغير الثاني provider يأخذ طريقة التشفير و يوجد عندنا طريقتين هما:

  • The Windows Data Protection API (DPAPI) Provider(DataProtectionConfigurationProvider)
  • RSA Protected Configuration Provider(RSAProtectedConfigurationProvider)

فالنوع الأول يقوم بالتشفير بناءً على مفتاح الجهازmachine key و لذلك عند نقل الكود إلى جهاز آخر لن يصبح التشفير فعال.

و النوع الآخر يستخدم مفتاح الـ RSA و هنا سوف استخدم النوع الأول و لاستخدام الـ RSA يمكنك البحث في Google.

الآن لنضع 2 Buttons في صفحة الـ ASP.NET. و نكتب بداخلها الكود التالي للتشفير:

ProtectSection("appSettings","DataProtectionConfigurationProvider");

 

و لفك التشفير:

UnProtectSection("appSettings");

 

فلو فرضنا انه يوجد لدينا هذا الجزء في ملف الـ Web.Config:

و الذي يحتوي على سم المستخدم و كلمة المرور.

<?xml version="1.0"?>


<configuration>
  <appSettings>
    <add key="userName" value="myUser" />
    <add key="password" value="myPass" />
  </appSettings> 
 <system.web>

و الآن و بعد التشفير سوف يكون شكل الملف:

<?xml version="1.0"?>


<configuration>
  <appSettings configProtectionProvider="DataProtectionConfigurationProvider">
    <EncryptedData>
      <CipherData>
        <CipherValue>AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAeqpnrspy5EWNYcNck7YWEgQAAAACAAAAAAADZgAAqAAAABAAAAA12J8TxeAXP5oTR3FRwzTUAAAAAASAAACgAAAAEAAAAD35nzw5BzWwX4kb/ba0k+/oAAAAWrmf/KLUkGMXbc24Un8GXU/q3BLDnuzemCXU2ooqlXVVRCJdOSxU/A34EajaAmPZH/hJY1lDHoqSL2yv69R7Ld2ebIMyA94+gpGJ+5BttQhaUrD8yi19D7j29JOtX1gZ+6dkLVLANI4zU4i46orH7Syy+DOdwaeJ5ZNrj60hu7bSzwMgq5QEKXJ0G/D8XwJY7LD2pdpzls+P7fheqYH5OXFevJKoJWUco+isMdrppE5zPnIF9zD2pmLFU6bUH0maBDjbBnP3QCu+9R3SlQ5ELVQAKx+ThCj3xBvh5P1cUBMaaFZtEaX3EBQAAABl+Fga/ikPCJAGBh1NQNICVKh3Yg==</CipherValue>
      </CipherData>
    </EncryptedData>
  </appSettings>



 <system.web>

 

و لابد من العلم أن الأجزاء التالية لا يمكن تشفيرها في الـ Web.Config:

  • processModel
  • runtime
  • mscorlib
  • startup
  • system.runtime.remoting
  • configProtectedData
  • satelliteassemblies
  • cryptographySettings
  • cryptoNameMapping
  • cryptoClasses
  •  

    طبعاً الجزء الأجمل أنه عندما تريد قراءة قيمة معينة في ملف الـ Web.Config مثلاً الـ connectionString لن تقوم بفك التشفير و لكن الـ ASP.NET سوف يقوم به نيابة عنك و لن تضطر لتغيير الكود.

     

    أما لكيفية تشفير أجزاء ملف الـ Web.Config عن طريق الـ .NET Command Line يمكنك الرجوع إلى هذا الرابط في MSDN.

     

    مع تمنايتي لكم بالتوفيق...

    طلال السبيعي.

    Del.icio.usDigg It!DZone It!Reddit

    التصنيف: .NET , ASP.NET , C# , أمن المعلومات
    البطاقات: , , ,

    البحث



    إخلاء مسؤولية
    جميع الآراء التي تم التعبير عنها هنا هي آرائي الشخصية وهذه الاّراء لا تمثل وجهة نظر عملي على أي حال.
    © جميع الحقوق محفوظة 2008 مدونة طلال
    Sign in