none
IssuedTokenOverTransport的认证,client端如何设置? RRS feed

  • 问题

  • <customBinding>
                    <binding name="CustomBinding_IProfileDBCacheService">
                        <security defaultAlgorithmSuite="Default" authenticationMode="IssuedTokenOverTransport"
                            requireDerivedKeys="false" securityHeaderLayout="Strict" includeTimestamp="true"
                            keyEntropyMode="CombinedEntropy" messageSecurityVersion="WSSecurity11WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10">
                            <issuedTokenParameters keyType="SymmetricKey" tokenType="" />
                            <localClientSettings cacheCookies="true" detectReplays="false"
                                replayCacheSize="900000" maxClockSkew="00:05:00" maxCookieCachingTime="Infinite"
                                replayWindow="00:05:00" sessionKeyRenewalInterval="10:00:00"
                                sessionKeyRolloverInterval="00:05:00" reconnectTransportOnFailure="true"
                                timestampValidityDuration="00:05:00" cookieRenewalThresholdPercentage="60" />
                            <localServiceSettings detectReplays="false" issuedCookieLifetime="10:00:00"
                                maxStatefulNegotiations="128" replayCacheSize="900000" maxClockSkew="00:05:00"
                                negotiationTimeout="00:01:00" replayWindow="00:05:00" inactivityTimeout="00:02:00"
                                sessionKeyRenewalInterval="15:00:00" sessionKeyRolloverInterval="00:05:00"
                                reconnectTransportOnFailure="true" maxPendingSessions="128"
                                maxCachedCookies="1000" timestampValidityDuration="00:05:00" />
                            <secureConversationBootstrap />
                        </security>
                        <binaryMessageEncoding maxReadPoolSize="64" maxWritePoolSize="16"
                            maxSessionSize="2048">
                            <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                                maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                        </binaryMessageEncoding>
                        <httpsTransport manualAddressing="false" maxBufferPoolSize="524288"
                            maxReceivedMessageSize="65536" allowCookies="false" authenticationScheme="Anonymous"
                            bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                            keepAliveEnabled="true" maxBufferSize="65536" proxyAuthenticationScheme="Anonymous"
                            realm="" transferMode="Buffered" unsafeConnectionNtlmAuthentication="false"
                            useDefaultWebProxy="true" requireClientCertificate="false">
                            <extendedProtectionPolicy policyEnforcement="Never" />
                        </httpsTransport>
                    </binding>
    binding 如上,authenticationMode="IssuedTokenOverTransport“
    现在已经生成代理类,想使用代理类连接service,不知道如何设置?
    ProfileDBCacheServiceClient client = new ProfileDBCacheServiceClient("CustomBinding_IProfileDBCacheService");
                IssuedTokenClientCredential clientCredential = client.ClientCredentials.IssuedToken;
    client.GetUserData(userCriteria);
    clientCredential里面的属性应该如何设置呀?
    2009年10月25日 7:49

答案

  • 我换了一种办法,直接使用Microsoft.IdentityModel.Protocols.WSTrust去取得STS的token
    首先要下载http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=118c3588-9070-426a-b655-6cec0a92c10b&hash=otN7E16unx4SwrFPl%2fCDrS13nxy9KHBWAjkvNpfp%2b%2fE28YmwkFZ7j6ZGYCstlWqsBrhr2sbdJVAUWz7sPJIGaQ%3d%3d
    然后改代码:
    挂代码:

     EndpointAddress STSAddress = new EndpointAddress("https://yjf:32844/SecurityTokenServiceApplication/securitytoken.svc");
                WSTrustClient STSclient = new WSTrustClient(GetSecurityTokenServiceBinding(), STSAddress);
    
                RequestSecurityToken rst = new RequestSecurityToken();
                rst.RequestType = WSTrust13Constants.RequestTypes.Issue;
                rst.AppliesTo = new EndpointAddress("https://yjf:32844/ec0d8bcccd004afaa06e7cbc4e1c0160/ProfileDBCacheService.svc");
                
                RequestSecurityTokenResponse rstr;
                STSclient.ClientCredentials.UserName.UserName = "yjf";
                STSclient.ClientCredentials.UserName.Password = "password";
                AcceptAllCertificate();
                
                STSclient.Issue(rst, out rstr);  
    



    感觉这条路应该是可行的,所以说之前走了很多弯路呀.....哎~
    但是还是跳出了问题:
    ID4007: The symmetric key inside the requested security token must be encrypted. To fix this, either override the SecurityTokenService.GetScope() method to assign appropriate value to Scope.EncryptingCredentials or set Scope.SymmetricKeyEncryptionRequired to false.

    我现在搜到的解决方案是这个:
    http://social.msdn.microsoft.com/Forums/en/Geneva/thread/8228a73f-59cd-4856-8826-7b0b48635c1e

    但是我不知道怎么做了~~我只能在client端操作,不能到server端操作,不知道里面的东西怎么操作

    楼主,指点一下呀~~~~~
    • 已标记为答案 yjf-10 2009年11月1日 8:55
    2009年10月27日 14:29

全部回复

  • Hi,
    这个问题。MSDN上的介绍:

    IssuedTokenOverTransport

    在此身份验证模式中,客户端不向服务进行身份验证,而是提供一个由安全令牌服务颁发的令牌,并证明知道共享密钥。颁发的令牌作为认可的支持令牌(即签署消息签名的令牌)显示在 SOAP 层上。在传输层,服务是用 X.509 证书进行身份验证的。安全绑定元素是由 CreateIssuedTokenOverTransportBindingElement 方法返回的 TransportSecurityBindingElement。或者,将 authenticationMode 属性设置为 IssuedTokenOverTransport

    给的参考代码:
    public static Binding CreateCertificateOverTransportBinding()
    {
        BindingElementCollection bec = new BindingElementCollection();
        bec.Add(SecurityBindingElement.
            CreateCertificateOverTransportBindingElement());
        bec.Add(new TextMessageEncodingBindingElement());
        bec.Add(new HttpsTransportBindingElement());
        return new CustomBinding(bec);
    }

    http://msdn.microsoft.com/en-us/library/aa702632.aspx

    你可以参考一下。另外如果查不到的话,可以使用google.com来搜索一下英文资料。


    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    欢迎访问老徐的中文技术博客:Welcome to My Chinese Technical Blog
    欢迎访问微软WCF中文技术论坛:Welcome to Microsoft Chinese WCF Forum
    欢迎访问微软WCF英文技术论坛:Welcome to Microsoft English WCF Forum
    2009年10月26日 2:38
    版主
  • 可能是我没说清楚,我现在的情景是从客户端编程连接服务器端,有wsdl生成的代理类和client的配置文件

    class Program
        {
            static void Main(string[] args)
            {
                ProfileDBCacheServiceClient client = new ProfileDBCacheServiceClient("CustomBinding_IProfileDBCacheService");
                client.ClientCredentials.IssuedToken.LocalIssuerBinding = CreateIssuedTokenOverTransportBinding();
                //client.ClientCredentials.IssuedToken.LocalIssuerBinding = new CustomBinding("CustomBinding_IProfileDBCacheService");
                UserSearchCriteria userCriteria = new UserSearchCriteria();
                try
                {
                    client.GetUserData(userCriteria);
                }
                catch (Exception e)
                {
                }
    
            }
    楼主的意思是这样的吗?
    但是:exception:{"The incoming policy could not be validated. For more information, please see the event log."}
    有用IssuedTokenOverTransport 认证通过的例子吗?可以贴上来吗?
    2009年10月26日 6:37
  • 不好意思,我还真没有这个方面例子的代码。
    所以只能看文档和你讨论问题了。
    你google一下,不行的话,我可以帮你把问题发到WCF英文论坛


    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    欢迎访问老徐的中文技术博客:Welcome to My Chinese Technical Blog
    欢迎访问微软WCF中文技术论坛:Welcome to Microsoft Chinese WCF Forum
    欢迎访问微软WCF英文技术论坛:Welcome to Microsoft English WCF Forum
    2009年10月26日 9:49
    版主
  • 谢谢楼主~ 但是问题还没解决,哎,工作任务...希望这周能解决这个IssuedToken的认证问题~阿门
    我再问一下吧,
    现在我的STS是在server端的一个securityTokenService.svc
    我要访问的服务时server端的另外一个服务ProfileDBService.svc

    先确定下我在client端做的是不是这样的:
    1,先取得securityTokenService的代理类
    2,用这个代理类发送请求(WS-trust的RST)
    3,获得securityTokenService的response(RSTR)
    4,将RSTR加入到header,随ProfileDBService的请求一同发出
    5,获得response

    然后这里有几个难点:
    1 securityTokenService的请求构造如何构造?
    2 如何将RSTR加入到ProfileDBService的请求里面去?
    • 已编辑 yjf-10 2009年10月27日 1:10 易于阅读
    2009年10月27日 1:08
  • 我换了一种办法,直接使用Microsoft.IdentityModel.Protocols.WSTrust去取得STS的token
    首先要下载http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=118c3588-9070-426a-b655-6cec0a92c10b&hash=otN7E16unx4SwrFPl%2fCDrS13nxy9KHBWAjkvNpfp%2b%2fE28YmwkFZ7j6ZGYCstlWqsBrhr2sbdJVAUWz7sPJIGaQ%3d%3d
    然后改代码:
    挂代码:

     EndpointAddress STSAddress = new EndpointAddress("https://yjf:32844/SecurityTokenServiceApplication/securitytoken.svc");
                WSTrustClient STSclient = new WSTrustClient(GetSecurityTokenServiceBinding(), STSAddress);
    
                RequestSecurityToken rst = new RequestSecurityToken();
                rst.RequestType = WSTrust13Constants.RequestTypes.Issue;
                rst.AppliesTo = new EndpointAddress("https://yjf:32844/ec0d8bcccd004afaa06e7cbc4e1c0160/ProfileDBCacheService.svc");
                
                RequestSecurityTokenResponse rstr;
                STSclient.ClientCredentials.UserName.UserName = "yjf";
                STSclient.ClientCredentials.UserName.Password = "password";
                AcceptAllCertificate();
                
                STSclient.Issue(rst, out rstr);  
    



    感觉这条路应该是可行的,所以说之前走了很多弯路呀.....哎~
    但是还是跳出了问题:
    ID4007: The symmetric key inside the requested security token must be encrypted. To fix this, either override the SecurityTokenService.GetScope() method to assign appropriate value to Scope.EncryptingCredentials or set Scope.SymmetricKeyEncryptionRequired to false.

    我现在搜到的解决方案是这个:
    http://social.msdn.microsoft.com/Forums/en/Geneva/thread/8228a73f-59cd-4856-8826-7b0b48635c1e

    但是我不知道怎么做了~~我只能在client端操作,不能到server端操作,不知道里面的东西怎么操作

    楼主,指点一下呀~~~~~
    • 已标记为答案 yjf-10 2009年11月1日 8:55
    2009年10月27日 14:29