Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
174 views
in Technique[技术] by (71.8m points)

c# - How can I set ClientCredentials?

I'm trying to consume a WCF service:

The config of the service is:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <system.serviceModel>
        <bindings>
            <netNamedPipeBinding>
                <binding name="netNamedPipeEndpoint" closeTimeout="00:01:00"
                    openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                    transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions"
                    hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="524288"
                    maxBufferSize="65536" maxConnections="10" maxReceivedMessageSize="65536">
                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                    <security mode="None">
                        <transport protectionLevel="EncryptAndSign" />
                    </security>
                </binding>
            </netNamedPipeBinding>
            <netTcpBinding>
                <binding name="netTcpEndpoint" closeTimeout="00:01:00" openTimeout="00:01:00"
                    receiveTimeout="00:10:00" sendTimeout="00:01:00" transactionFlow="false"
                    transferMode="Buffered" transactionProtocol="OleTransactions"
                    hostNameComparisonMode="StrongWildcard" listenBacklog="10"
                    maxBufferPoolSize="524288" maxBufferSize="65536" maxConnections="10"
                    maxReceivedMessageSize="65536">
                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                    <reliableSession ordered="true" inactivityTimeout="00:10:00"
                        enabled="false" />
                    <security mode="None">
                        <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" />
                        <message clientCredentialType="Windows" />
                    </security>
                </binding>
            </netTcpBinding>
            <wsHttpBinding>
                <binding name="wsHttpBindingConfiguration" closeTimeout="00:01:00"
                    openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                    bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
                    maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                    messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
                    allowCookies="false">
                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                    <reliableSession ordered="true" inactivityTimeout="00:10:00"
                        enabled="false" />
                    <security mode="None">
                        <transport clientCredentialType="Windows" proxyCredentialType="None"
                            realm="" />
                        <message clientCredentialType="Windows" negotiateServiceCredential="true" />
                    </security>
                </binding>
            </wsHttpBinding>
        </bindings>
        <client>
            <endpoint address="net.tcp://webapppro-v11/FlightInfoWebService/FlightInfoService.svc"
                binding="netTcpBinding" bindingConfiguration="netTcpEndpoint"
                contract="FlightInfoService" name="netTcpEndpoint" />
            <endpoint address="net.pipe://webapppro-v11/FlightInfoWebService/FlightInfoService.svc"
                binding="netNamedPipeBinding" bindingConfiguration="netNamedPipeEndpoint"
                contract="FlightInfoService" name="netNamedPipeEndpoint" />
            <endpoint address="http://webapppro-v11/FlightInfoWebService/FlightInfoService.svc"
                binding="wsHttpBinding" bindingConfiguration="wsHttpBindingConfiguration"
                contract="FlightInfoService" name="wsHttpBindingConfiguration" />
        </client>
    </system.serviceModel>
</configuration>

When I try to call the service:

public async void LoadCities()
{
    _client = new FlightInfoServiceClient(Maquette_MyAirport_Win8.FlightService.FlightInfoServiceClient.EndpointConfiguration.wsHttpBindingConfiguration, "http://servuucs.fr/FlightInfoWebService/FlightInfoService.svc");

    var citiesResponse = await _client.GetAllCitiesAsync(new BaseRequest());
    var  myCities = citiesResponse.Cities;
}

I catch this exception:

ERROR: UnAuthorizedAccess description:You are not authorized to access this service

How can I set my ClientCredentials?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

As @Paciv noted in a comment, you can do this through code. Set them with the property ClientCredentials.Windows, something like this:

_client.ClientCredentials.Windows.ClientCredential.Domain = "warzone42";
_client.ClientCredentials.Windows.ClientCredential.UserName = "user1428798";
_client.ClientCredentials.Windows.ClientCredential.Password = "p@ssw0rd";

Setting the credentials in code is of course unwise. If you don't set the Windows user programmatically as above, I believe the credentials from the user running the client are sent accross (which is perhaps a more typical situation?).

Note that if you're setting credentials in code you may in fact be looking for UserName authentication.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...