为简单的 WCF 服务启用基本身份验证?

2023-11-23

我有一个非常简单的 WCF Web 服务,客户在自己的 IIS 上托管该服务。

客户有自己的客户端,他们一直在测试环境中对其进行测试,一切都工作正常,直到他们禁用匿名身份验证并启用基本身份验证。一旦他们这样做了,他们就开始出现错误:

The authentication schemes configured on the host ('Basic') do not allow those configured on the binding 'BasicHttpBinding' ('Anonymous'). Please ensure that the SecurityMode is set to Transport or TransportCredentialOnly. 

那么,我需要做什么才能使基本身份验证正常工作?

我的网络服务当前web.config:

<configuration>
    <system.web>
        <compilation debug="true" targetFramework="4.5" />
        <httpRuntime targetFramework="4.5" />
    </system.web>
    <system.serviceModel>
        <behaviors>
            <serviceBehaviors>
                <behavior name="">
                    <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
                    <serviceDebug includeExceptionDetailInFaults="false" />
                </behavior>
            </serviceBehaviors>
        </behaviors>
        <serviceHostingEnvironment aspNetCompatibilityEnabled="true"
            multipleSiteBindingsEnabled="true" />
    </system.serviceModel>
</configuration>

我有自己的测试客户端,可以针对我的网络服务运行。其目前的app.config:

<configuration>
    <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_IMyServiceSvc" />
            </basicHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://localhost/MyServiceSvc.svc"
                binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IMyServiceSvc"
                contract="MyServiceSvc.IMyServiceSvc"
                name="BasicHttpBinding_IMyServiceSvc" />
        </client>
    </system.serviceModel>
</configuration>

当我在本地 IIS 上安装该服务并针对它运行客户端时,一切正常,并且启用了匿名身份验证。

我需要做什么才能在 IIS 中打开基本身份验证并将客户端和服务器配置为使用基本身份验证?

我当前的测试客户端代码:

public class BlackHillsCompletionSvcTest
{
    static void Main(string[] args)
    {
        using (var client = new MyServiceSvcClient())
        {
            var data = new Data
            {
                id = "1",
                description = "test data"
            };

            try
            {
                var result = client.receiveData(data);
            }
            catch (Exception ex)
            {
                var msg = ex.Message;
            }
        }
    }
}

==尝试:==

根据 Pankaj Kapare 的建议,我将其添加到网络服务中web.config:

<system.serviceModel>
    <bindings>
        <basicHttpBinding>
            <binding name="httpBinding">
                <security mode="TransportCredentialOnly">
                    <transport clientCredentialType="Basic" />
                </security>
            </binding>
        </basicHttpBinding>
    </bindings>
    ...
</system.serviceModel>

这样,我在创建客户端时遇到错误:

The binding at system.serviceModel/bindings/basicHttpBinding does not have a configured binding named 'BasicHttpBinding_IMyServiceSvc'. This is an invalid value for bindingConfiguration. 

所以我将其添加到客户的app.config:

<system.serviceModel>
    <bindings>
        <basicHttpBinding>
            <binding name="BasicHttpBinding_IMyServiceSvc">
                <security mode="TransportCredentialOnly">
                    <transport clientCredentialType="Basic" />
                </security>
            </binding>
        </basicHttpBinding>
    </bindings>
    ...
</system.serviceModel>

这样,我又得到了另一个错误:

The username is not provided. Specify username in ClientCredentials.

所以我在客户端添加了用户名和密码:

using (var client = new MyServiceSvcClient())
{
    client.ClientCredentials.UserName.UserName = "myusername";
    client.ClientCredentials.UserName.Password = "mypassword";
    ...
}

这样,我又收到另一个错误:

The requested service, 'http://localhost/MyServiceSvc.svc' could not be activated.  Which got me wondering. So I loaded the .svc page in my browser, was asked to log in, and after I did, I saw this:

The authentication schemes configured on the host ('Basic') do not allow those configured on the binding 'BasicHttpBinding' ('Anonymous').  Please ensure that the SecurityMode is set to Transport or TransportCredentialOnly.  Additionally, this may be resolved by changing the authentication schemes for this application through the IIS management tool, through the ServiceHost.Authentication.AuthenticationSchemes property, in the application configuration file at the <serviceAuthenticationManager> element, by updating the ClientCredentialType property on the binding, or by adjusting the AuthenticationScheme property on the HttpTransportBindingElement.

这就是客户所看到的。

Ideas?

== 也许有一个解决方案? ==

我认为可能缺少的是服务器上的服务定义,将绑定绑定到端点:

<system.serviceModel>
    <bindings>
        <basicHttpBinding>
            <binding name="httpBinding">
                <security mode="TransportCredentialOnly">
                    <transport clientCredentialType="Basic" />
                </security>
            </binding>
        </basicHttpBinding>
    </bindings>
    <services>
        <service
                name="MyServiceSvcNs.MyServiceSvc"
                behaviorConfiguration="ServiceWithMetaData"
                >
            <endpoint name="Default"
                address=""
                binding="basicHttpBinding"
                bindingConfiguration="httpBinding"
                contract="MyServiceSvcNs.IMyServiceSvc"
                />
        </service>
    </services>
    <behaviors>
        <serviceBehaviors>
            <behavior name="ServiceWithMetaData">
                <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
                <serviceDebug includeExceptionDetailInFaults="false" />
            </behavior>
        </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"
        multipleSiteBindingsEnabled="true" />
</system.serviceModel>

有了这个,事情似乎正在发挥作用。至少乍一看是这样。


好吧,我明白了。

首先,在IIS管理器中,您需要关闭匿名身份验证,并打开基本身份验证。这可能需要首先启用基本身份验证,然后重新启动 IIS 管理器。这是基本的 IIS 内容,并不是我的问题的一部分。

然后,我们需要更改 Web 服务的 web.config。如果你还记得的话,它看起来像这样:

<configuration>
    <system.web>
        <compilation debug="true" targetFramework="4.5" />
        <httpRuntime targetFramework="4.5" />
    </system.web>
    <system.serviceModel>
        <behaviors>
            <serviceBehaviors>
                <behavior name="">
                    <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
                    <serviceDebug includeExceptionDetailInFaults="false" />
                </behavior>
            </serviceBehaviors>
        </behaviors>
        <serviceHostingEnvironment aspNetCompatibilityEnabled="true"
            multipleSiteBindingsEnabled="true" />
    </system.serviceModel>
</configuration>

我们需要将其更改为:

<configuration>
    <system.web>
        <compilation debug="true" targetFramework="4.5" />
        <httpRuntime targetFramework="4.5" />
    </system.web>
    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="httpTransportCredentialOnlyBinding">
                    <security mode="TransportCredentialOnly">
                        <transport clientCredentialType="Basic" />
                    </security>
                </binding>
            </basicHttpBinding>
        </bindings>
        <services>
            <service
                    name="MyServiceSvcNs.MyServiceSvc"
                    behaviorConfiguration="ServiceWithMetaData"
                    >
                <endpoint name="Default"
                    address=""
                    binding="basicHttpBinding"
                    bindingConfiguration="httpTransportCredentialOnlyBinding"
                    contract="MyServiceSvcNs.IMyServiceSvc"
                    />
            </service>
        </services>
        <behaviors>
            <serviceBehaviors>
                <behavior name="ServiceWithMetaData">
                    <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
                    <serviceDebug includeExceptionDetailInFaults="false" />
                </behavior>
            </serviceBehaviors>
        </behaviors>
        <serviceHostingEnvironment aspNetCompatibilityEnabled="true"
            multipleSiteBindingsEnabled="true" />
    </system.serviceModel>
</configuration>

我们正在做的是定义具有 TransportCredentialOnly 安全性的 basicHttpBinding。然后我们定义一个服务,以及使用该绑定的端点。

然后在客户端,我们有:

<configuration>
    <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_IMyServiceSvc" />
            </basicHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://localhost/MyServiceSvc.svc"
                binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IMyServiceSvc"
                contract="MyServiceSvc.IMyServiceSvc"
                name="BasicHttpBinding_IMyServiceSvc" />
        </client>
    </system.serviceModel>
</configuration>

这需要更改为:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="httpTransportCredentialOnlyBinding">
                    <security mode="TransportCredentialOnly">
                        <transport clientCredentialType="Basic" />
                    </security>
                </binding>
            </basicHttpBinding>
        </bindings>
        <client>
            <endpoint
                address="http://localhost/MyServiceSvc.svc"
                binding="basicHttpBinding"
                bindingConfiguration="httpTransportCredentialOnlyBinding"
                contract="MyServiceSvc.IMyServiceSvc"
                name="BasicHttpBinding_IMyServiceSvc"
                />
        </client>
    </system.serviceModel>
</configuration>

在这里,我们再次创建具有 TransportCredentialOnly 安全性的 basicHttpBinding,并修改端点以使用它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为简单的 WCF 服务启用基本身份验证? 的相关文章

  • 来自给定 wsdl 文件的“java 表单生成器”

    我正在尝试用 java 开发一个表单生成器 用户可以在其中编写 wsdl url 并获取 ComboBox 中 Web 服务支持的操作列表 当用户选择 ComboBox 中的一项时 他将看到使用 wsdl url 生成的表单字段 我是 We
  • 使用 JAX-WS 的 WebLogic 中没有模式导入的单个 WSDL

    如何使用 JAX WS 配置由 WebLogic 10 3 6 生成的 Web 服务 以将对象架构包含在单个 WSDL 文件声明 而不是导入声明 中 示例代码 界面 import javax ejb Local Local public i
  • 捕获传入和传出的肥皂请求

    我有一个 C 控制台应用程序 它调用基于 SSRS Soap 的 Web 服务 服务在远程计算机上运行 我想捕获传入和传出的肥皂请求 如何才能做到这一点 Thanks 这只是为了调试目的吗 如果是这样 Fiddler http www fi
  • Task.Delay 值得取消吗?

    我最近使用取消模式重新实现了一大堆异步 WCF 服务方法 我在很多地方都看到过这种模式的描述 您可以在其中等待Task WhenAny在已启动的任务和 Task Delay 上 当然 现有任务是不可取消的 但这有望在以后的版本中得到解决 就
  • Web 服务器是否可以向自身发出 HTTPS 请求?

    假设您有两个应用程序 A 和 B 在同一 Web 服务器上运行 您希望应用程序 A 通过 SSL 调用应用程序 B 上的 webService 是否可以使用类似的地址来做到这一点https localhost appsB webServic
  • 肥皂服务的良好框架是什么?

    我正在寻找一个用于肥皂的好框架service 我更喜欢使用Pythonic框架 但是在查看了soaplib rpclib 太不稳定 SOAPy 不适用于2 7 和ZSI 太 令人困惑 之后 我不确定这是否可能 我对使用另一种语言感到满意 尽
  • 将授权标头添加到 Web 参考

    我正在尝试向客户端的网络服务发出请求 我不知道客户端的底层平台 我使用 添加 Web 引用 在 Visual Studio 2010 中使用了客户端的 WSDL 并生成了我的代理类 称为 ContactService 我现在需要将如下所示的
  • 双工服务的实例、会话和并发

    我有一个要求 服务应该每秒向客户端发送一条消息 该服务只能有一个客户端 我创建了一个双工服务 现在对该服务的实例 并发性和会话感到困惑 双工服务是否始终需要会话 会话模式 必需 InstanceContextMode 是否应始终为 PerS
  • 需要 WCF 的完整 DI 示例

    有人有完整且有效的 WCF DI 示例吗 Every http www eggheadcafe com tutorials aspnet b428fb65 08b4 45c8 97cd 47ee1a1eaf41 composing wcf
  • 将 Web 场迁移到 ASP.NET 运行时版本 4,同时保持会话

    我们已将 Web 应用程序从 net 运行时 2 v 3 5 迁移到 net 运行时 4 v 4 5 我有一个部署问题 我们的 sessionstate 服务器是一个 stateserver 并在单独的服务器上运行框架 2 中的 aspne
  • 调用 Web 服务时“请求失败,响应为空”

    从 aspx 页面调用服务器中托管的 Web 服务时 收到类似 请求失败 响应为空 的错误 我的页面中的代码 try HttpWebRequest request1 HttpWebRequest WebRequest Create http
  • 使用 MSBuild Web 部署到服务器

    我在 VS 2012 项目中设置了发布配置文件 当我在 VS 中右键单击该项目 选择 发布 并单击 发布 按钮时 它会使用 发布配置文件 中提供的设置将项目发布到服务器 当我使用 msbuild 和命令行时 使用以下语法 msbuild e
  • 如何在 React Native 中调用 SOAP Web 服务

    我是反应原生开发的新手 在我的应用程序中 我需要调用肥皂网络服务 在 android 中 我使用 ksoap 库来提供肥皂网络服务 但是在 React Native 中是否有可用的库或示例代码 我为此进行了很多搜索 但没有找到任何关于此的好
  • 我是否需要在 WCF DataContract 中公开构造函数才能使其在客户端上的对象实例化期间工作?

    我在 WCF 服务中有一个类 我们称之为A A是一个数据协定 其中包含另一个自定义对象的集合作为其数据成员之一B 为了避免客户端出现空引用问题 我实例化了BList在构造函数中像这样 DataContract public class A
  • 如何引用 WEB-INF 中的 client_deploy.wsdd 文件?

    一个基本问题 但我似乎找不到答案 我有一个 Axis 生成的 Web 服务 它还调用另一个 Web 服务 其存根也是使用 Axis 生成的 它部署在weblogic 9 2中 所谓的 Web 服务需要身份验证 我已经用谷歌搜索了设置身份验证
  • 如何从球衣服务端点发送实体列表?

    我正在从球衣服务器发送实体列表 在客户端 我试图获取这些实体列表 但它给了元帅例外 为什么它在元素名末尾添加 s 即 emps 而不是 emp XmlRootElement public class Emp Server side code
  • PowerShell:检索AppPool中的应用程序数量

    如何通过 PowerShell 命令检索与特定 IIS AppPool 关联的应用程序数量 我们可以使用以下命令手动查看关联的应用程序 Get Item IIS AppPools AppPoolName 但是 如果我们想要手动选择Appli
  • AddressAccessDeniedException :无需 netsh 即可解决它?

    我遇到了异常AddressAccessDeniedException因为我的processus没有注册URL的权限 我首先以管理员身份运行我的程序 好的 它成功了 但我现在想要分发我的应用程序 并且我希望每个用户都能够运行它 而不必成为管理
  • IIS 7 规范 URL 重定向

    我想让一个网站的地址中始终包含 www 并通过 IIS 重写强制执行 例如 test com 将变为 www test com 典型的重写规则示例是
  • 对注册表项“全局”的访问被拒绝

    在向 defaultAppPool 用户授予权限时 我收到消息 没有这样的全局用户或组 DefaultAppPool 有人能帮我一下吗 但是 使用命令 net localgroup Performance Monitor Users Def

随机推荐

  • HTML5

    我正在尝试嵌入一个指向 PHP 文件提供的 MP3 或 OGG 数据的 HTML5 音频元素 当我在 Safari 中查看页面时 会出现控件 但 UI 上显示 直播 当我单击 播放 时 音频将按预期开始 但是 一旦结束 我就无法通过单击 播
  • 如何使用CSS让div填充剩余的垂直空间

    我正在尝试制作一个标准的网站布局header a 导航栏一个身体 在右侧导航栏 and a footer 现在我已经这样做了
  • 如何检测类型是否是另一种通用类型

    example public static void DoSomething
  • 来自 Week 和 WeekYear 的 LocalDate

    使用 NodaTime 库 如何根据周数和周 WeekYear 计算一周第一天的 LocalDate 与此相反 var date new LocalDate 2012 1 1 int weekYear date WeekYear 2011
  • 如何制作一个字典,返回字典中缺少的键的键,而不是引发 KeyError?

    我想创建一个 python 字典 它返回字典中缺少的键的键值 使用示例 dic smart dict dic a one a print dic a gt gt gt one a print dic b gt gt gt b dicts 有
  • 如何使用 HQL 将“null”放入列中?

    如何构建有效的HQL字符串 相当于 UPDATE 表 SET 字段 null WHERE 您的意思是批量 HQL 更新吗 尝试这个 UPDATE myEntity e SET e myProperty null WHERE 您还可以使用上述
  • 在 iPhone 上存储用户名和密码的最佳做法是什么?

    是否有在 iPhone 上存储用户名和密码的最佳实践方法 我正在寻找明显安全的东西 但也会在应用程序更新之间保留信息 使用苹果钥匙串 NSString getPasswordForUsername NSString username and
  • “显示完整站点”按钮可绕过 CSS 媒体查询

    我在我的网站上使用 CSS 媒体查询 以在较小的设备上切换到更垂直的布局 这工作得很好 但我想在网站上添加一个按钮 其中包含 显示桌面版本 之类的内容 我想让这个按钮 或链接 无论什么 强制或改变媒体查询评估 以便它们评估好像屏幕宽度比实际
  • Jenkins 在 Mercurial 提交后构建

    我已经在这个项目上工作了大约一周 我已经在网上搜索了两天 没有任何明确的解释 对于学校作业 我们需要使用以下程序设置构建服务器 Maven 作为我们的构建工具 Mercurial 作为我们的版本控制系统 Java JRE javac 和 j
  • 愤怒的小鸟喜欢滚动菜单

    当您启动 愤怒的小鸟 并点击 开始 时 您会看到一个水平滚动的菜单 其中有一条居中的图像 单击后您就可以开始游戏等等 我想知道如何制作一个与此类似的菜单 它可以横向滚动 水平 并显示可点击的图像 提前致谢 我认为你可以通过水平滚动视图 Ho
  • 无法在函数内访问 jQuery $.get 中的全局变量

    下面是我遇到问题的一些代码 基本上 我将一个空数组定义为全局变量 var playlist 然后尝试在 jQuery get 调用中向其中添加元素 根据我在互联网上读到的内容 我应该能够做到这一点 以下代码给出错误 无法调用未定义的方法 p
  • 混合类型类和类型族时出现问题

    这段代码编译得很好 LANGUAGE MultiParamTypeClasses FunctionalDependencies FlexibleInstances UndecidableInstances FlexibleContexts
  • 如何使用@Autowired像工厂模式一样动态注入实现

    我对 Sprint 相当陌生 我的应用程序使用 Spring 3 x 和 roo1 1 1 我有一个接口的多个实现 该接口将被 Autowired 到其他不同的类中 我只能在运行时决定采用哪种实现 这应该通过类似工厂模式来实现 public
  • 如何为登录用户更改 ionic 中的侧菜单

    我想在用户登录时更改侧面菜单的内容 示例 1 用户未登录 当用户未登录时 会显示此侧面菜单 示例 2 用户已登录 正如您所看到的 有几个额外的菜单项 这些仅在用户登录时显示 在我的控制器中 http get http 127 0 0 1 8
  • 使用 IntelliJ IDEA 生成 JavaDoc 中的图像[重复]

    这个问题在这里已经有答案了 我正在尝试将图像包含在我的 JavaDoc 中 我跟随文档并将图像存储在doc files在包目录中 我的 javadoc 看起来像 This is class desctiprion Image p img s
  • 获取当前用户上下文

    我在从不同位置 C 应用程序 Web 服务 运行 powershellscript 时遇到问题 我认为这是一个用户上下文问题 所以现在我试图找出 powershell 脚本在哪个用户上下文下运行 是否有可能记录 powershell 脚本的
  • 从另一个视图类重新加载集合视图数据

    我的视图中有两个容器 最上面有一个集合视图 当从下面的容器点击按钮时 我想通过按钮更新我的集合视图 我的按钮还更改了我的集合视图使用的数组的值 我以为 didSet 可以完成这项工作 但不幸的是没有成功 Top class TopViewC
  • ASP.NET MVC5 未针对请求的 URL 配置 Web 服务器,并且服务器上未启用目录浏览

    我在从 MVC5 应用程序加载页面时遇到问题 我安装并使用了这个软件 Windows 10 Visual Studio 企业版 2015 微软 IIS 10 0 Express MVC 5 与实体框架 到目前为止 一切正常 我能够显示该网站
  • JSON.parse意外字符错误

    我收到此错误 JSON parse 意外字符 当我在萤火虫中运行此语句时 JSON parse balance 0 count 0 time 1323973673061 firstname howard userId 5383 locali
  • 为简单的 WCF 服务启用基本身份验证?

    我有一个非常简单的 WCF Web 服务 客户在自己的 IIS 上托管该服务 客户有自己的客户端 他们一直在测试环境中对其进行测试 一切都工作正常 直到他们禁用匿名身份验证并启用基本身份验证 一旦他们这样做了 他们就开始出现错误 The a