2014-01-24 39 views
0

我覺得很奇怪,我能夠在我公司的exchange 2010服務器上使用運行在我的XP機器上的asp.net 4.0 web應用程序在我的日曆中創建約會,這甚至不是域!,但是當我上傳同樣的代碼來我公司生產的Web應用服務器(這是不一樣的Exchange服務器),然後我得到的錯誤如下:Exchange Web服務託管API不授權

System.Net.WebException: The remote server returned an error: (401) Unauthorized

我使用的整個窗口的身份驗證。使用service.UseDefaultCredentials = true;我不能爲每個將使用此應用程序的員工使用用戶名/口令。 我想在生產Web應用程序服務器(Windows 2008 m/c)中存在一些問題(權限/權限/禁用模擬)問題。我甚至使用IIS 7中的應用程序池身份,通過選擇它可能在其下運行的所有內置帳戶,但同樣的錯誤。我可以清楚地看到它在Appointment.Save()調用之前正在我的Windows帳戶下運行。我簡單地使用登錄用戶的憑據進行模擬,然後刪除模擬。我在別處看到了這種技術。但是這也沒有任何區別。

這些代碼文件:

Default.aspx.cs

//(沒有多少是在標記頁面Default.aspx的事情因此不包括。)

  using System; 
      using System.Collections.Generic; 
      using System.Web; 
      using System.Web.UI; 
      using System.Web.UI.WebControls; 


      using Microsoft.Exchange.WebServices.Data; 
      using Microsoft.Exchange.WebServices.Autodiscover; 
      using System.Web.Configuration; 

      namespace TestExchangeWebServices 
      { 
       public partial class _Default : System.Web.UI.Page 
       { 
        protected ExchangeService service; 

        protected void Page_Load(object sender, EventArgs e) 
        { 
         service = new ExchangeService(ExchangeVersion.Exchange2010); 
         service.UseDefaultCredentials = true; 
         service.Url = new Uri(WebConfigurationManager.AppSettings["EWSURL"]); 


         SetAppointment("Test", DateTime.Now, "Test"); 

        } 

        public void SetAppointment(string Subject, DateTime AptDateTime, string Body) 
        { 
         Appointment apt = new Appointment(service); 
         apt.Subject = Subject; 
         apt.Body = Body; 
         apt.Body.BodyType = BodyType.HTML; 
         apt.Start = AptDateTime; 
         apt.End = apt.Start.AddMinutes(30.00); 
         apt.ReminderMinutesBeforeStart = 15; 
         apt.IsReminderSet = true; 

         HttpContext.Current.Trace.Write("Before Impersonation: System.Security.Principal.WindowsIdentity.GetCurrent().Name = " + System.Security.Principal.WindowsIdentity.GetCurrent().Name ); 

         System.Security.Principal.WindowsImpersonationContext impersonationContext; 
         impersonationContext = ((System.Security.Principal.WindowsIdentity)HttpContext.Current.User.Identity).Impersonate();// //System.Threading.Thread.CurrentPrincipal.Identity 

         HttpContext.Current.Trace.Write("Before Saving Appointment. System.Security.Principal.WindowsIdentity.GetCurrent().Name = " + System.Security.Principal.WindowsIdentity.GetCurrent().Name); 
//This is where the call is made and error occurs        
apt.Save(SendInvitationsMode.SendToNone); 
         HttpContext.Current.Trace.Write("After Saving Appointment."); 

         impersonationContext.Undo(); 
        } 

       } 
      } 

Web.Config

<?xml version="1.0"?> 


    <configuration> 
    <appSettings configProtectionProvider="RsaProtectedConfigurationProvider"> 
     <EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element" 
     xmlns="http://www.w3.org/2001/04/xmlenc#"> 
     <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc" /> 
     <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#"> 
      <EncryptedKey xmlns="http://www.w3.org/2001/04/xmlenc#"> 
      <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5" /> 
      <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#"> 
       <KeyName>Rsa Key</KeyName> 
      </KeyInfo> 
      <CipherData> 
       <CipherValue>0Sw7QiYFKoD65nCXfakXUhJrjapk4uyQ9u6aPBStxB1XBIIPtXbuZJZb/GyMxgl7Gi3sqIkoq66BKa+MSzjAkpkIfnZmOhMNVomKofC3rlEf9NeIAdCEvjcmENhfGyA6aEJj96mGDxRDBE/FP1iQ8Z3x8Rob+HG1sbD0YJy2rpA=</CipherValue> 
      </CipherData> 
      </EncryptedKey> 
     </KeyInfo> 
     <CipherData> 
      <CipherValue>HmmlAzyuedvlQ/+grwRKjTs5Z7sg5dYShHFYsFcI0q2ugkZ7oYYNTTEycyqzKyXmaaqwyE2lAsApApSvT+JDys021+sMrqLrF37xAkjRimKbPTylgznRZLQx2qKAZstb6qIis2mcLykgURtp2ytfoPl83jJzEU1y6PtB0loB/p4=</CipherValue> 
     </CipherData> 
     </EncryptedData> 
    </appSettings> 
    <connectionStrings> 
     <add name="ApplicationServices" 
      connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\aspnetdb.mdf;User Instance=true" 
      providerName="System.Data.SqlClient" /> 
    </connectionStrings> 

    <system.web> 
     <identity impersonate="false"/> 

     <customErrors mode="Off"></customErrors> 

     <compilation debug="true" targetFramework="4.0" /> 

     <authentication mode="Windows"> 

     </authentication> 

     <membership> 
     <providers> 
      <clear/> 
      <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="ApplicationServices" 
       enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" 
       maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" 
       applicationName="/" /> 
     </providers> 
     </membership> 

     <profile> 
     <providers> 
      <clear/> 
      <add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="ApplicationServices" applicationName="/"/> 
     </providers> 
     </profile> 

     <roleManager enabled="false"> 
     <providers> 
      <clear/> 
      <add name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" connectionStringName="ApplicationServices" applicationName="/" /> 
      <add name="AspNetWindowsTokenRoleProvider" type="System.Web.Security.WindowsTokenRoleProvider" applicationName="/" /> 
     </providers> 
     </roleManager> 

    </system.web> 

    <system.webServer> 
     <modules runAllManagedModulesForAllRequests="true"/> 

     <httpErrors errorMode="Detailed" /> 
     <asp scriptErrorSentToBrowser="true"/> 

    </system.webServer> 
    </configuration> 

回答