DCSIMG
Question from Tapuz .Net forum: Authentication and Impersonation flow in ASP.Net and Sql Server - Justin myJustin = new Justin( Expriences.Current );

Question from Tapuz .Net forum: Authentication and Impersonation flow in ASP.Net and Sql Server

שאלה:

באפליקציית ASP.Net החיבור ל-DB לא עובד כשמנסים מרחוק, להבדיל מכאשר מנסים לוקלית (F5). למטה יש את הודעת השגיאה: 

Server Error in '/aa' Application.
--------------------------------------------------------------------------------
Cannot open database "pubs" requested by the login. The login failed.

Login failed for user 'MOSHE-F91B90F39\ASPNET'.

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.Data.SqlClient.SqlException: Cannot open database "pubs" requested by the login. The login failed.
Login failed for user 'MOSHE-F91B90F39\ASPNET'.

 

תשובה:

לפי מה שאתה מתאר סביר להניח שמדובר ב-Impersnation עם Windows Authentcation של ASP.Net בשילוב עם Windows Authentication של סיקוול סרבר.

image

ל-ASP.Net יש שלושה אפשרויות לזיהוי משתמשים:
- None, כלום, אין שום מנגנון ברירת מחדל של ASP.Net שאחראי לזיהוי משתמשים ובהתאם אין יכולת להשתמש ב-Membership, Roles ו-Profiles

        <authentication mode="None" />

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

        <authentication mode="Forms" />

- Windows, מאמת את המשתמש לפי משתמש של חלונות. מבוסס על זיהוי בין שני מחשבים או באמצעות Domain Controller של Active Directory. כלומר, הזיהוי שלך בחלונות הוא הזיהוי שלך לאפליקציית ASP.Net. מיותר לציין שהיות ושרת בצד השני של העולם לא יכיר את שם המשתמש שלך, האפשרות הזאת אינה בשימוש באינטרנט אלא רק ברשתות פנימיות.

        <authentication mode="Windows" />

- Passport, מאפשר אימות לפי .Net Passport. (וזאת הסיבה שאמרתי שיש רק שלוש אפשרויות, כי עוד לא נתקלתי באתר מחוץ למיקרוסופט שמשתמש בזה)

        <authentication mode="Passport" />

 

ASP.Net צריך לרוץ בתוך השרת תחת ההרשאות של משתמש מסויים (למשל כי הוא ניגש לקבצים ובכלל כי הפריימוורק צריכה הרשאות של משתמש כלשהו). המשתמש הזה כברירת מחדל הוא משתמש בשם ASPNET שמותקן על המחשב ומקושר ל-IIS במהלך התקנת דוט נט פריימוורק.
ב-ASP.Net יש מנגנון בשם Impersnation שמאפשר לאפליקציה ספציפית לרוץ תחת הקונטקסט של משתמש אחר.
אפשרות אחת היא  לפרט שם משתמש, סיסמה (ודומיין של Active Directory) ואפשרות שנייה היא להשתמש ב-Windows Authentication שסופק ע"י המשתמש ולהתחזות למשתמש הזה. כלומר, ASP.Net ירוץ תחת קונטקסט האבטחה של המשתמש שהתחבר לאפליקציה.  

<?xml version="1.0"?>

<configuration>

    <appSettings/>

    <connectionStrings/>

    <system.web>

         <identity impersonate="true"/>

        <authentication mode="Windows"  />

    </system.web>

</configuration>

 

סיקוול סרבר מאפשר שתי אפשרויות לזיהוי משתמשים:
Windows Authentication שבדומה ל-ASP.Net לוקח את המשתמש המחובר של חלונות ובודקת ביחס לשרת הסיקוול ולמסד נתונים ספציפי בתוכו אם יש למשתמש הרשאות.
Mixed Mode מאפשר זיהוי לפי Windows Authentication וגם לפי שם משתמש וסיסמה שהם Hard-coded בתוך הסיקוול סרבר עצמו. כלומר, סיקוול סרבר ינהל לעצמו רשימת שמות משתמש וסיסמאות.

image 


כחלק ממחרוזת החיבור מאפליקציה לסיקוuל סרבר ניתן לפרט שם משתמש וסיסמה או שרוצים Integrate Security שבפועל זה Windows Authentication.

מה שקורה אצלך באפליקציה זה ככה:
משתמש ניגש לאתר ה-ASP.Net.
המשתמש מזוהה לפי Windows Authentication. (כי ככה פורט ב-web.config)
ASP.Net מתחזה למשתמש שכרגע התחבר לאתר. (גם, כי ככה מפורט ב-web.config)
ASP.Net מנסה להתחבר לסיקוול סרבר עם Integrated Security. כלומר, ASP.Net שולח לסיקוול את קונטקסט האבטחה שתחתיו הוא רץ ובפועל זה המשתמש שהתחבר לאתר.
סיקוול סרבר רואה איזה שם משתמש מוזר של חלונות שהוא לא מכיר ודוחה את בקשת ההתחברות.

יש הרבה דרכים לפתור את "השגיאה" שקיבלת.
להתחבר לסיקוול עם שם משתמש וסיסמה קבועים שיקבעו בתוך המסד נתונים ויפורטו במחרוזת החיבור למסד.
לחבר את סיקוול סרבר ל-Domain Controller של Active Directory ואז לאפשר לו להכיר את כל המשתמשים המחוברים פנימית.
ועוד הרבה, תלוי בארכיטקטורת האבטחה המועדפת אלייך.
כ-כלל אצבע באפליקציות ASP.Net אינטרנט ציבוריות נהוג לקבוע impersonate=false ו-Authentication כ-Forms.
ובסיקוול סרבר במצבים כאלו מומלץ להשתמש ב-Mixed Mode Authentication עם שם משתמש וסיסמה קבוע לאפליקציה. (מה שגם נותן בוסט גדול בביצועים לעומת Windows Authentication)

 

קישור: http://www.tapuz.co.il/tapuzforum/main/Viewmsg.asp?forum=831&msgid=102140192

Published Sunday, July 15, 2007 11:56 AM by Justin-Josef Angel [MVP]

Comments

No Comments