Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

[WCF .NET 3.0] Authentication zonder certificaten *

Pagina: 1
Acties:
  • 130 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Hallo,

De functies die mijn WCF service bevat wil ik beschermen en alleen toegankelijk maken voor bepaalde gebruikers binnen een groep. Ik heb een lokale groep "Test" aangemaakt met gebruikers Test1 en Test2. Beide hebben ook een wachtwoord.

Ik heb heel wat documenatie gelezen over de verschillende bindary's en de mogelijkheden daarbij om authenticatie met een WCF server te regelen. Maar al deze dingen maken gebruik van certificaten. Ik wil geen certificaten en SSL gebruiken, maar gewoon een simpele username/password authenticatie die gekoppelt is met de lokale gebruiker/groep van het systeem waar de service draait. Heeft iemand een simpel voorbeeld of weet iemand waar ik hier meer informatie over kan vinden?

Ik heb verschillende mogelijkheden geprobeerd. Bij de meeste krijg ik of exceptions of de melding "Access Denied" wanneer ik mezelf probeer te authenticeren. Ook wanneer ik de gegevens goe invul. Ik heb ook geprobeer de computernaam voor de groepnaam te zetten en voor de gebruikers ook. Toch wil het allemaal niet. Suggesties?

Zie code hieronder:

Verwijderd

Topicstarter
Mijn Service Host:
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
' Create the binding.
        Dim binding As New WSHttpBinding()
        binding.Security.Mode = SecurityMode.Message
        binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic

        ' Create the URI for the endpoint.
        Dim httpUri As New Uri("http://localhost/Service")

        ' Create the service host and add an endpoint.
        Dim myServiceHost As New ServiceHost(GetType(MyService), httpUri)
        myServiceHost.AddServiceEndpoint(GetType(IMyServiceContract), binding, "")

        ' Meta behavior.
        Dim metadataBehavior As New ServiceMetadataBehavior()
        metadataBehavior.HttpGetUrl = New Uri("http://localhost/service/meta")
        metadataBehavior.HttpGetEnabled = True
        myServiceHost.Description.Behaviors.Add(metadataBehavior)

        ' Open the service.
        myServiceHost.Open()
        Console.WriteLine("Listening...")
        Console.WriteLine("Press Enter to exit.")
        Console.ReadLine()

        ' Close the service. 
        myServiceHost.Close()


De functie die ik aanroep in mijn service:
Visual Basic:
1
2
3
4
5
6
7
8
9
10
    <PrincipalPermission(SecurityAction.Demand, Role:="Users")> _
    Public Function GetData(ByVal varName As String, ByVal year As Integer, ByVal month As Integer) As String Implements IMyServiceContract.GetData
        Return "HELLO"
    End Function

    ' Ook geprobeerd:
    '<PrincipalPermission(SecurityAction.Demand, Role:="COMPUTERNAME\Users")> _
    'Public Function GetData(ByVal varName As String, ByVal year As Integer) As String Implements IMyServiceContract.GetData
    '    Return "HELLO"
    'End Function


Mijn Client:
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
' Create the binding.
        Dim myBinding As New WSHttpBinding()
        myBinding.Security.Mode = SecurityMode.Message
        myBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic

        Dim ea As New EndpointAddress("http://localhost/service")
        Dim cc As New MyServiceClientBase(myBinding, ea)

        cc.ClientCredentials.UserName.UserName = "testuser"
        cc.ClientCredentials.UserName.Password = "test1234"

        ' Begin using the client.
        Try
            cc.Open()

            Console.WriteLine(cc.Channel.GetData("Indicator", 2006, 1))
            Console.ReadLine()

            ' Close the client.
            cc.Close()
        Catch tex As TimeoutException
            Console.WriteLine(tex.Message)
            cc.Abort()
        Catch cex As CommunicationException
            Console.WriteLine(cex.Message)
            cc.Abort()
        Finally
            Console.WriteLine("Closed the client")
            Console.ReadLine()
        End Try


Ik krijg Access is denied als exception. Mijn gebruiker komt gewoon vóór in de lokale groep Users. Ook heb ik met de Administrator account geprobeerd. Toch krijg ik Access is denied te zien. Iemand een idee waarom dit gebeurd? Heeft dit met een certificaat te maken? Ik wil geen certificaten gebruiken en dus ook geen SSL/HTTPS transport van mijn gegevens. Ik wil gewoon toegang krijgen tot mijn functie via een username/password via gewoon HTTP (plain text). Suggesties?

Verwijderd

Topicstarter
Het is mij gelukt om mijn probleem op te lossen door BasicHttpBinding te gebruiken met de onderstaande instellingen.

Visual Basic:
1
2
3
4
        Dim binding As New BasicHttpBinding()
        binding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly
        binding.Security.Message.ClientCredentialType = BasicHttpMessageCredentialType.UserName
        binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic


Omdat ik BasicHttpBinding gebruik verlies ik mijn flexibiliteit om sessies te beheren. Is er een mogelijkheid om een andere Binding object te gebruiken die sessies ondersteund, maar ook zoals BasicHttpBinding geen transport beveiliging hoeft te hebben?

Vooral de regel binding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly is cruciaal om de boel werkend te krijgen. Iemand ervaring met CustomBiding?

  • D-Raven
  • Registratie: November 2001
  • Laatst online: 16-10 10:47
Ik heb met hetzelfde bijltje gekapt als jij, wat betreft die authenticatie. Enigste verschil was dat het voor mij niet relevant was dat er sessies gebruikt werden.

Volgens de documentatie wordt bij basicHttpBinding overal de secure session default uitgezet... dit kun je interpreteren als: "het kan wel, maar het staat standaard uit". Of het ook echt kan zul je zelf moeten uitproberen.

Misschien dat je iets hebt aan deze link: klik

En dan met name het "establishSecurityContext" attribuut. Kan het nu zo niet testen dus je zult zelf even moeten kijken of het werkt ;)

Edit: Voor het gebruik van een sessie zul zowiezo allowCookies aan moeten zetten in je binding. Anders wordt er alsnog een nieuwe sessie voor elke proxy call gemaakt.

[ Voor 12% gewijzigd door D-Raven op 26-10-2007 09:03 ]


Verwijderd

Topicstarter
D-Raven schreef op vrijdag 26 oktober 2007 @ 08:52:
Ik heb met hetzelfde bijltje gekapt als jij, wat betreft die authenticatie. Enigste verschil was dat het voor mij niet relevant was dat er sessies gebruikt werden.

Volgens de documentatie wordt bij basicHttpBinding overal de secure session default uitgezet... dit kun je interpreteren als: "het kan wel, maar het staat standaard uit". Of het ook echt kan zul je zelf moeten uitproberen.

Misschien dat je iets hebt aan deze link: klik

En dan met name het "establishSecurityContext" attribuut. Kan het nu zo niet testen dus je zult zelf even moeten kijken of het werkt ;)

Edit: Voor het gebruik van een sessie zul zowiezo allowCookies aan moeten zetten in je binding. Anders wordt er alsnog een nieuwe sessie voor elke proxy call gemaakt.
Is het dan niet mogelijk om een andere Binding te gerbuiken zoals WSHttpBinding of iets anders wat sessies ondersteund en opdezelfde manier onbeveiligd de UserName en Password naar de service kan sturen? Ik hoef niet per se BasicHttpBinding te gebruiken, als het maar werkt met Username / Password en dan zonder transport beveiliging met SSL/HTTPS of iets dergelijks.

BasicHttpBinding gebruikt binding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly om de UserName en Password naar de service door te sturen. Er is daarbij geen encryptie omdat ik binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic gebruik. Is het niet mogelijk om dit ook bij WSHttpBinding toe te passen of bij een ander HTTP-gerelateerd Binding?