동일한 인증 뒤에 웹 서비스를 호출하기 위해 이미 (기본) 인증 된 컨텍스트를 얻는 방법은 무엇입니까?

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

문제

기본 인증 (IIS6) 뒤에 사이트가 있습니다.

이 사이트의 일부는 사이트의 일부인 웹 서비스를 호출하여 기본 인증 뒤에도합니다.

그러나 이런 일이 발생하면 호출 코드는 401 인증 오류를 수신합니다.

일반 권장 사항은 다음과 같은 코드입니다.

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

그러나 이것은 내 문제를 해결하지 못하는 것 같습니다.

어떤 충고?

편집하다

이것은 드문 문제가 아닌 것처럼 보이지만 지금까지 나는 해결책을 찾지 못했습니다. 여기에 있습니다 하나의 스레드 주제에.

도움이 되었습니까?

해결책

해결책 : (나는 이것이 누군가를 도울 것이라고 거의 확신합니다)

보다 이 링크 VB 의이 솔루션의 소스 (Jshardy에게 감사합니다!)의 경우, 내가 한 모든 것은 C#로 변환되었습니다.

NB : 이 작업이 작동하려면 IIS에서 기본 인증 만 사용해야하지만 아마도 적응할 수 있습니다. 또한 페이지 인스턴스를 또는 최소한 request.servaribarible 속성 (또는 페이지 코드-비만에서 호출 한 경우 'this'를 사용)도 전달해야합니다. 나는 이것을 정리하고 아마도 참고 문헌의 사용을 제거 할 것입니다. 그러나 이것은 원래 솔루션의 충실한 번역이므로 필요한 수정 사항을 만들 수 있습니다.

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;
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top