向Azure Web应用程序上托管的SOAP WCF添加简单安全性

本文关键字:SOAP WCF 添加 安全性 简单 Web Azure 应用 应用程序 程序上 | 更新日期: 2023-09-27 18:20:08

我在azure web应用程序上托管了一个SOAP WCF。此服务将仅由服务器使用,并且不包含任何UI。我只需要一个服务帐户来验证我的WCF。我不能使用oauth,因为它是SOAP。我读了一些关于ACS的文章,但在我的情况下,这似乎有些过头了,因为我只想使用一个帐户来保护我的WCF。我的想法是,我将利用Azure AD在那里创建一个服务帐户,并使用它来保护服务。

这在网络应用程序上可能吗?或者我需要在网络角色上主持它吗?在任何情况下,我如何在基于我的前提的WCF上实现简单的安全性?

向Azure Web应用程序上托管的SOAP WCF添加简单安全性

详细答案示例

经过一般性讨论,以下是建立传输安全性+简单密码的详细示例(在IIS、内部部署或Azure中,我刚刚测试过它)

这非常简单
-没有角色,没有基于身份的声明性或程序性控制
-身份是硬编码的
-没有使用更强的消息安全性(中间人)
-传输安全性是最低限度的,因为基本身份验证不安全。

该安全场景对于实现来说很短

1.创建具有传输安全性的Web服务

 <system.serviceModel>
 <bindings>
  <basicHttpBinding>
    <binding name="BasicBindingConfiguration">
      <security mode="Transport">
        <transport clientCredentialType="None"/>
      </security>
    </binding>
  </basicHttpBinding>
 </bindings>
<services>
  <service name="HelloServiceLibrary.HelloService" behaviorConfiguration="customIdentificationBehavior">
    <endpoint address=""
              binding="basicHttpBinding"
              contract ="HelloServiceLibrary.IHelloService"
              name="basicEndpoint"
              bindingConfiguration="BasicBindingConfiguration">
    </endpoint>

2.查找基本身份验证的模块声明

<system.webServer>
  <modules>
    <add name="BasicAuthenticationModule"
         type="Security.UserNameModuleAuthenticator,App_Code/Security" />
  </modules>
</system.webServer>  

3.模块的实现:

public class UserNameModuleAuthenticator : IHttpModule{
    ...
    public void OnAuthenticateRequest(object source, EventArgs eventArgs){
      HttpApplication app = (HttpApplication)source;
      string authStr = app.Request.Headers["Authorization"];
      string username = ...; // from header 
      string password = ...; // from header 
      if (username == "gooduser" && password == "password")
            {
                app.Context.User = new GenericPrincipal(new GenericIdentity(username, "Custom Provider"), null);
            }
            else
            {
                DenyAccess(app);
                return;
            }

4配置客户端以通过基本身份验证

<system.serviceModel>
  <bindings>
    <basicHttpBinding>
      <binding name="basicEndpoint">
        <security mode="Transport" >
          <transport clientCredentialType="Basic"
                     proxyCredentialType="None"
                     realm="" />
        </security>
      </binding>
    </basicHttpBinding>
  </bindings>
  <client>
    <endpoint address="https://localhost/TransportUsernameService/HelloService.svc"
      binding="basicHttpBinding" bindingConfiguration="basicEndpoint"
      contract="SecureServiceReference.IHelloService" name="basicEndpoint" />
  </client>
</system.serviceModel>

5.在客户端将**凭据传递到服务器**

HelloServiceClient client = new HelloServiceClient("basicEndpoint",
    new EndpointAddress("https://testsecurewebservice.azurewebsites.net/HelloService.svc"));
client.ClientCredentials.UserName.UserName = userName;
client.ClientCredentials.UserName.Password = password;
String msg = client.SayHello(userName);

可能的扩展

  • 创建/管理一些用户(使用ASP.Net提供程序或自定义库)
  • 有一些角色
  • 对以下方法设置一些声明性权限:
[PrincipalPermission(SecurityAction.Demand, Role = "Manager")]

此处提供完整的解决方案:http://1drv.ms/1Q5j9w0

问候

对于身份验证,您可以使用:

  • 用于传递{login,password}的用户名验证
  • X509识别客户端的机制(需要在客户端上部署证书)
  • 自定义身份验证

对于传输安全,您可以使用:

  • 使用服务器端安装的证书的消息安全性
  • 传输安全性(HTTPS)

但强烈建议您也使用一些消息安全性,而不是传输安全性。传输(Https/SSL)可能会受到中间人(控制路由器)的攻击。

消息安全性的缺点是您必须在服务器上安装证书

在web角色中设置证书要容易得多,您可以在Role.OnStart方法中进行设置

  • 如果您热衷于网络应用程序,这里有一个使用用户名提供传输安全的链接
    (您应该跳过ASP.NET MemberShip/Role提供程序的部分,因为您需要一个用户,而数据库是额外的工作):

https://msdn.microsoft.com/en-us/library/ff649647.aspx

  • 如果您热衷于消息安全,您应该转到web角色并使用消息安全证书

具有消息安全性的自定义身份验证链接:
http://www.codeproject.com/Articles/33872/Custom-Authorization-in-WCF

问候