2012-01-17 16 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

シングルサインオンを使用していませんでしたが、実際には同じ問題が発生していました。だから私はこれがまさにあなたが経験していることではないかと思います。

問題は、マシンCへの上にこれらの資格情報を送信する(?SharePointの)マシンBに資格情報を与えるマシン上のユーザーを持っているし、その後マシンBを持つことができないということです

これは「ダブルホップ」問題と呼ばれ、セキュリティ機能ですが、私はそれが技術的な側面ではありません。私たちのソリューションはKerberosを使用することでした。

私は、これは、それはあなたがこの特定の問題を排除するのに役立ちますことを、あなたが助け、そうでない場合は願っています:)

+0

ええ、「ダブルホップ」になってくれてありがとうございます。 –

+0

ケルベロスのセットアップ方法を教えてください。 –

0

あなたのサーバー側のコードは、あなたのSharePointサービスアカウントでアプリケーションプールのIDとして実行されています。私はそれがあなたが「サーバーユーザー」の意味であると仮定しています。

esb.UseDefaultCredentials = true; 

は、コンテキストの信用度を使用します。私はEWSサービスで何が利用できるのか分からないので、あなたがより高い特権のアカウントを使用し、来るユーザ、すなわちHttpContext.Current.User.Identityをパラメータとして利用できるなら、それは最良の方法。

あなたはEWSサービスに直接認証し、サーバー側のコードをすべてスキップして、必要なときにサーバの内容を表示するものを書くことができます。&

EWSサービスに直接ユーザーを認証する方法を見つける必要があります。ダブルホップはNTLMの問題です.NTLMチケットは最初のホップにのみ有効です。 Kerberosはそれを修正しますが、依然として偽装する必要があります。

+0

ありがとう、javaスクリプトを使ってEWSサービスを呼び出すことは可能ですか?もしそうなら、それはパフォーマンスを向上させるので本当に素晴らしいでしょう、それ以外の場合はKerberosを試してみてください –

関連する問題