none
Frage zu einem WebService RRS feed

  • Frage

  • hallo zusammen,

    ich habe folgenden einfachen WebService gebastelt. In meiner lokalen Entw.-Umgebung läuft der WebService fehlerfrei durch.

    Auf unserem internen WebServer liefert der WebService bei den ersten drei Versuchen den "WhoAmIRequest" auszuführen ein "Fehler bei der Anforderung mit HTTP-Status 401: Unauthorized."
    Der WebService soll sich mit der aktuellen AD-Anmeldung an das CRM anmelden und dort einige Daten abrufen und an ein anderes System weitergeben. Wenn ich den WebService direkt auf dem WebServer aufrufe, dann werde ich zunächst nach einer AD-Anmeldung gefragt. Diese Anmeldung findet sich auch in Me.User.Identity.Name wieder und entspricht einem gültigen CRM-Benutzer.

    Wer kann mir helfen?

        <System.Web.Services.WebService(Namespace:="http://crmservices.meinedomain.de/")> _
        <System.Web.Services.WebServiceBinding(ConformsTo:=System.Web.Services.WsiProfiles.BasicProfile1_1)> _
        <System.ComponentModel.ToolboxItem(False)> _
        Public Class CrmService
            Inherits System.Web.Services.WebService
    
            <System.Web.Services.WebMethod()> _
            Public Function HelloWorld() As String
                Dim _i As System.Security.Principal.IIdentity
                Dim _CrmService As MicrosoftCrmSdk.CrmService
                Dim _WhoAmI As MicrosoftCrmSdk.WhoAmIResponse
                Dim _CurrUser As MicrosoftCrmSdk.systemuser
                Dim _Password As String
    
                _i = Me.User.Identity ' _i.Name liefert "meineDomain\\hh" ein gültigen UserAccount
                _CrmService = Me.GetCrmService()
                Try
                    ' 1. Versuch
                    _WhoAmI = _CrmService.Execute(New MicrosoftCrmSdk.WhoAmIRequest) ' liefert ein "Fehler bei der Anforderung mit HTTP-Status 401: Unauthorized."
    
    
                    ' 2. Versuch
                    _CrmService.Credentials = System.Net.CredentialCache.DefaultCredentials
                    _WhoAmI = _CrmService.Execute(New MicrosoftCrmSdk.WhoAmIRequest) ' liefert ein "Fehler bei der Anforderung mit HTTP-Status 401: Unauthorized."
    
    
                    ' 3. Versuch
                    _CrmService.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials
                    _WhoAmI = _CrmService.Execute(New MicrosoftCrmSdk.WhoAmIRequest) ' liefert ein "Fehler bei der Anforderung mit HTTP-Status 401: Unauthorized."
    
    
                    ' 4. Versuch
                    _Password = "meinKennwort"
                    _CrmService.Credentials = New System.Net.NetworkCredential("Administrator", _Password, "meineDomain")
                    _WhoAmI = _CrmService.Execute(New MicrosoftCrmSdk.WhoAmIRequest) ' funktioniert
    
    
                    ' 5. Versuch
                    _CrmService.Credentials = New System.Net.NetworkCredential("hh", _Password, "meineDomain")
                    _WhoAmI = _CrmService.Execute(New MicrosoftCrmSdk.WhoAmIRequest) ' funktioniert
                    _CurrUser = _CrmService.Retrieve(MicrosoftCrmSdk.EntityName.systemuser.ToString, _WhoAmI.UserId, New MicrosoftCrmSdk.AllColumns())
    
                    Return "Hello " & _CurrUser.fullname & " (" & _i.Name & ")"
                Catch ex As System.Exception
    
                End Try
    
                Return "Hello (" & _i.Name & ")"
            End Function
    
    
            ''' <summary>
            ''' Set up the CRM Service.
            ''' </summary>
            ''' <returns>CrmService configured with AD Authentication</returns>
            Private Function GetCrmService() As MicrosoftCrmSdk.CrmService
                ' Get the CRM Users appointments
                ' Setup the Authentication Token
                Dim _Token As New MicrosoftCrmSdk.CrmAuthenticationToken()
                _Token.OrganizationName = "meinOrgName"
    
                Dim service As New MicrosoftCrmSdk.CrmService()
    
                Dim builder As New System.UriBuilder("http://meincrmserver:5555")
                builder.Path = "//MSCRMServices//2007//CrmService.asmx"
                service.Url = builder.Uri.ToString()
    
                service.UseDefaultCredentials = True
                service.CrmAuthenticationTokenValue = _Token
    
                Return service
            End Function
    
        End Class
    

    Schöne Grüße aus Bayern Heiko Heinrich-Nestler XING: http://www.xing.com/profile/Heiko_HeinrichNestler
    Dienstag, 8. Dezember 2009 09:34

Antworten

  • Hallo Heiko,

    wie ckeller schon sagte, lautet das Zauberwort impersonation.

    Anbei ein Artikel, der die Authentifizierung von einer ASPX-Seite zum CRM erklärt:
    http://msdn.microsoft.com/en-us/library/cc151050.aspx
    Viele Grüße

    Michael Sulz
    axcentro GmbH
    MVP für Microsoft Dynamics CRM
    Dienstag, 8. Dezember 2009 11:58
  • Hallo Heiko,

    die zwei Codezeilen machen verwenden die Authentifizierung die gerade im Kontext vorhanden ist. Damit hier die Authentifizierung des anfragenden Benutzers verwendet wird und nicht die des Benutzers unter dem der Webservice ausgeführt wird, muss die Anwendung entsprechend konfiguriert werden. Siehe z.B. http://support.microsoft.com/kb/306158

    Wenn du deinen Webservice debuggst, kannst du nachsehen wie die Credentials gesetzt werden. Überprüfe ob hier die Credentials des anfragenden oder des ausführenden Benutzers verwendet wird.
    Dienstag, 8. Dezember 2009 11:38

Alle Antworten

  • Hallo Heiko,

    wo läuft der Webservice? Läuft er im Kontext des CRM, sprich im ISV-Verzeichnis (ohne virtuelles Verzeichnis, eigene Anwendung, ...) oder als eigenständiger Service der einfach auf das CRM-System zugreifen soll?
    Je nachdem unterscheidet sich die Art und Weise des Verbindungsaufbaus.
    Dienstag, 8. Dezember 2009 09:47
  • Hallo, der WebService läuft auf einem ganz anderen Server innerhalb unserer Domain und soll auf das CRM zugreifen.
    Schöne Grüße aus Bayern Heiko Heinrich-Nestler XING: http://www.xing.com/profile/Heiko_HeinrichNestler
    Dienstag, 8. Dezember 2009 09:50
  • Hi Heiko,

    was mir gerade auffällt. Bei deinem CrmAuthenticationToken fehlt der AuthenticationType, der in deinem Fall 0 sein muss. Wichtig bei deinem Webservice ist in dem Fall auch, dass er die Windows-Authentifizierung durchschleust.
    Dienstag, 8. Dezember 2009 10:02
  • Hallo ckeller,

    der AuthenticationType ist 0 (vermutlich standardmäßig), habe ich gerade geprüft. Was meinst Du mit "Windows-Authentifizierung durchschleussen". Ich war eigentlich der Meinung, dass dies passiert, wenn ich   _CrmService.Credentials = System.Net.CredentialCache.DefaultCredentials  oder  _CrmService.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials  angebe. Oder habe ich irgendetwas übersehen?



    Schöne Grüße aus Bayern Heiko Heinrich-Nestler XING: http://www.xing.com/profile/Heiko_HeinrichNestler
    Dienstag, 8. Dezember 2009 10:36
  • Hallo Heiko,

    die zwei Codezeilen machen verwenden die Authentifizierung die gerade im Kontext vorhanden ist. Damit hier die Authentifizierung des anfragenden Benutzers verwendet wird und nicht die des Benutzers unter dem der Webservice ausgeführt wird, muss die Anwendung entsprechend konfiguriert werden. Siehe z.B. http://support.microsoft.com/kb/306158

    Wenn du deinen Webservice debuggst, kannst du nachsehen wie die Credentials gesetzt werden. Überprüfe ob hier die Credentials des anfragenden oder des ausführenden Benutzers verwendet wird.
    Dienstag, 8. Dezember 2009 11:38
  • Hallo Heiko,

    wie ckeller schon sagte, lautet das Zauberwort impersonation.

    Anbei ein Artikel, der die Authentifizierung von einer ASPX-Seite zum CRM erklärt:
    http://msdn.microsoft.com/en-us/library/cc151050.aspx
    Viele Grüße

    Michael Sulz
    axcentro GmbH
    MVP für Microsoft Dynamics CRM
    Dienstag, 8. Dezember 2009 11:58