Wie erhalte ich einen bereits (unverwässert) authentifizierte Kontext einen Webdienst hinter derselben Authentifizierung zu nennen?

StackOverflow https://stackoverflow.com/questions/245835

Frage

Ich habe eine Seite hinter der Basisauthentifizierung (IIS 6).

Ein Teil dieser Website ruft einen Web-Service, der auch Teil der Website ist und somit hinter der Standardauthentifizierung als auch.

Wenn dies jedoch der Angerufene Code geschieht erhält ein 401 Authentifizierungsfehler.

Ich habe ein paar Dinge ausprobiert, mit dem allgemeinen Empfehlung ist Code wie folgt:

Service.ServiceName s = new Service.ServiceName();
s.PreAuthenticate = true;
s.Credentials = System.Net.CredentialCache.DefaultCredentials;
s.Method("Test");

Allerdings scheint dies nicht mein Problem zu lösen.

Jede Beratung?

Bearbeiten

Dies scheint ein nicht ungewöhnlich Problem zu sein, aber bisher habe ich keine Lösungen gefunden. Hier ist ein Thread zum Thema.

War es hilfreich?

Lösung

Lösung: (Ich bin fast sicher, dass dies jemand helfen wird)

finden Sie unter Link für die Quelle dieser Lösung in VB ( dank jshardy!), alles, was ich tat, war zu C # konvertieren.

Hinweis: Sie müssen nur die Standardauthentifizierung auf IIS verwenden für diese zu arbeiten, aber es kann wohl angepasst werden. Sie müssen auch in einer Seite Beispiel passieren, oder zumindest die Request.ServerVariables Eigenschaft (oder verwenden Sie ‚this‘, wenn von einer Seite namens Code-Behind-direkt). Ich würde dieses aufzuräumen und wahrscheinlich die Verwendung von Referenzen entfernen, aber dies ist eine getreue Übersetzung der ursprünglichen Lösung und Sie können alle Änderungen erforderlich machen.

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);
    }
}

Andere Tipps

Die Zeile:

s.Credentials = System.Net.CredentialCache.DefaultCredentials();

Vielleicht sollten Sie versuchen:

s.Credentials = HttpContext.Current.User.Identity;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top