كيف يمكنني الحصول على الفعل (الأساسية) مصادقة السياق إلى استدعاء خدمة ويب وراء نفس المصادقة ؟
-
05-07-2019 - |
سؤال
لدي موقع ما وراء المصادقة الأساسية (IIS6).
جزء من هذا الموقع المكالمات خدمة ويب التي هي أيضا جزء من الموقع وبالتالي وراء المصادقة الأساسية كذلك.
ومع ذلك ، عندما يحدث هذا رمز الدعوة يحصل على مصادقة 401 خطأ.
لقد حاولت بضعة أشياء ، مع التوصية العامة كونها رمز مثل هذا:
Service.ServiceName s = new Service.ServiceName();
s.PreAuthenticate = true;
s.Credentials = System.Net.CredentialCache.DefaultCredentials;
s.Method("Test");
ولكن هذا لا يبدو لحل مشكلتي.
أي نصيحة ؟
تحرير
يبدو أن هذا ليس من غير المألوف المسألة ولكن حتى الآن لم أجد أي حلول.هنا موضوع واحد عن هذا الموضوع.
المحلول
الحل:(انا على يقين تقريبا وهذا سوف يساعد شخص ما)
انظر هذا الرابط عن مصدر هذا الحل في VB (شكرا jshardy!), كل ما فعلته هو تحويل إلى C#.
ملحوظة:: يجب استخدام المصادقة الأساسية فقط على IIS لهذا العمل ، لكن قد يكون تكييفها.تحتاج أيضا لتمرير الصفحة على سبيل المثال ، أو على الأقل طلب.ServerVariables الملكية (أو استخدام 'هذا' إذا دعا من صفحة التعليمات البرمجية-خلف مباشرة).أود أن ترتب هذا الأمر وربما إزالة استخدام المراجع ولكن هذا هو فية الترجمة من الأصل الحل و يمكنك إجراء أي تعديلات ضرورية.
public static void ServiceCall(Page p)
{
LocalServices.ServiceName s = new LocalServices.ServiceName();
s.PreAuthenticate = true; /* Not sure if required */
string username = "";
string password = "";
string domain = "";
GetBasicCredentials(p, ref username, ref password, ref domain);
s.Credentials = new NetworkCredential(username, password, domain);
s.ServiceMethod();
}
/* Converted from: http://forums.asp.net/t/1172902.aspx */
private static void GetBasicCredentials(Page p, ref string rstrUser, ref string rstrPassword, ref string rstrDomain)
{
if (p == null)
{
return;
}
rstrUser = "";
rstrPassword = "";
rstrDomain = "";
rstrUser = p.Request.ServerVariables["AUTH_USER"];
rstrPassword = p.Request.ServerVariables["AUTH_PASSWORD"];
SplitDomainUserName(rstrUser, ref rstrDomain, ref rstrUser);
/* MSDN KB article 835388
BUG: The Request.ServerVariables("AUTH_PASSWORD") object does not display certain characters from an ASPX page */
string lstrHeader = p.Request.ServerVariables["HTTP_AUTHORIZATION"];
if (!string.IsNullOrEmpty(lstrHeader) && lstrHeader.StartsWith("Basic"))
{
string lstrTicket = lstrHeader.Substring(6);
lstrTicket = System.Text.Encoding.Default.GetString(Convert.FromBase64String(lstrTicket));
rstrPassword = lstrTicket.Substring((lstrTicket.IndexOf(":") + 1));
}
/* At least on my XP Pro machine AUTH_USER is not set (probably because we're using Forms authentication
But if the password is set (either by AUTH_PASSWORD or HTTP_AUTHORIZATION)
then we can use LOGON_USER*/
if (string.IsNullOrEmpty(rstrUser) && !string.IsNullOrEmpty(rstrPassword))
{
rstrUser = p.Request.ServerVariables["LOGON_USER"];
SplitDomainUserName(rstrUser, ref rstrDomain, ref rstrUser);
}
}
/* Converted from: http://forums.asp.net/t/1172902.aspx */
private static void SplitDomainUserName(string pstrDomainUserName, ref string rstrDomainName, ref string rstrUserName)
{
rstrDomainName = "";
rstrUserName = pstrDomainUserName;
int lnSlashPos = pstrDomainUserName.IndexOf("\\");
if (lnSlashPos > 0)
{
rstrDomainName = pstrDomainUserName.Substring(0, lnSlashPos);
rstrUserName = pstrDomainUserName.Substring(lnSlashPos + 1);
}
}
نصائح أخرى
الخط:
s.Credentials = System.Net.CredentialCache.DefaultCredentials();
ربما عليك أن تحاول :
s.Credentials = HttpContext.Current.User.Identity;