2012-01-17 78 views
0

我們有一個奇怪的問題,我們有單點登錄,並且我們試圖從Exchange ews webservice中獲取未讀電子郵件數,問題是它總是對所有用戶都有同樣的計數,服務器用戶。Sharepoint沒有從活動目錄獲取當前用戶NetworkCredential

'it should now get for current user who requested the page 
'but its always for server user where sharepoint is installed 
Public Sub GetUnreadEmailCount() 
    Dim errormsg As String = String.Empty 
    Dim UnreadCount As Integer = 0 
    Dim esb As New ExchangeServiceBinding 

    Try 
     esb.RequestServerVersionValue = New RequestServerVersion 
     esb.RequestServerVersionValue.Version = ExchangeVersionType.Exchange2007_SP1 
     esb.UseDefaultCredentials = True 
     esb.Url = Domain + "/EWS/Exchange.asmx" 

     ServicePointManager.ServerCertificateValidationCallback = New RemoteCertificateValidationCallback(AddressOf CertificateValidationCallBack) 


     Dim biArray(1) As BaseFolderIdType 
     Dim dfFolder As New DistinguishedFolderIdType 
     dfFolder.Id = DistinguishedFolderIdNameType.inbox 
     biArray(0) = dfFolder 
     Dim geGetFolder As New GetFolderType 
     geGetFolder.FolderIds = biArray 
     geGetFolder.FolderShape = New FolderResponseShapeType 
     geGetFolder.FolderShape.BaseShape = DefaultShapeNamesType.AllProperties 
     Dim gfResponse As GetFolderResponseType = esb.GetFolder(geGetFolder) 

     Dim rmta As ResponseMessageType() = gfResponse.ResponseMessages.Items 
     Dim rmt As FolderInfoResponseMessageType = DirectCast(rmta(0), FolderInfoResponseMessageType) 
     If rmt.ResponseClass = ResponseClassType.Success Then 
      Dim folder As FolderType = DirectCast(rmt.Folders(0), FolderType) 
      UnreadCount = folder.UnreadCount 

     End If 

     Label1.Text = vbCrLf + "Unread email count : " + UnreadCount.ToString 
     ' Return UnreadCount 
    Catch ex As Exception 
     If Not ex.Message Is Nothing Then errormsg = ex.Message 
     Try 
      If Not ex.InnerException.Message Is Nothing Then errormsg = errormsg + " : " + ex.InnerException.Message 
     Catch e As Exception 

     End Try 
    Finally 
     If esb IsNot Nothing Then esb.Dispose() : esb = Nothing 
     If Not errormsg = String.Empty Then 
      Label1.Text = vbCrLf + "Error : " + errormsg 
     End If 
    End Try 

End Sub 

回答

1

雖然我們沒有使用單點登錄,但實際上我們遇到了同樣的問題。所以我不確定這正是你正在經歷的。

的問題是,你不能有一個用戶在機器A給他們的憑據機器B(的SharePoint?),然後有機器B發送到計算機C這些憑據

它被稱爲「雙跳」問題,並且是一項安全功能,但我並沒有真正進入技術層面。我們的解決方案是使用Kerberos。

我希望這可以幫助你,如果不是,它可以幫助你排除這個具體問題:)

+0

嗯,感謝它可能是「雙跳」,讓我試試,讓你知道.. – 2012-01-19 06:41:37

+0

你能指導我如何設置Kerberos? – 2012-01-19 08:15:57

0

你的服務器端代碼運行的應用程序池的身份,這是您的SharePoint服務帳戶。我假設這就是'服務器用戶'的意思。

esb.UseDefaultCredentials = true; 

將使用上下文的信用。我不確定EWS服務中有哪些可用的功能,因此如果您可以使用更高權限的帳戶並基於用戶進入,即HttpContext.Current.User.Identity作爲參數,那麼可能是最好的辦法。

您可以通過javascript直接對EWS服務進行身份驗證,完全跳過服務器端代碼,然後編寫一些消耗的東西,根據需要顯示服務器內容。

您需要找到一種方法將用戶直接授權給EWS服務。雙跳是NTLM的問題,因爲您的NTLM票證僅對第一跳有效。 Kerberos修復了這個問題,但你仍然需要模擬。

+0

感謝allot,是否可以通過java腳本調用EWS服務?如果是,那麼這將非常棒,因爲它會提高性能,否則請嘗試Kerberos並讓你知道 – 2012-01-19 06:39:21

相關問題