|
I celebrate disagreement; it introduces new ideas. This is why, sadly, I must continue to disagree with your statements.
The key issue I have is that you are talking about SOAP over HTTP, yet using only the SOAP specifications for information, when you should be using the HTTP specs as well.
Your question was"
"We have two web services hosted on the same SOAP server. I want to allow user A to access web service 1 but not web service 2. I want to allow
user B to access web service 2 but not web service 1.
How will I stop user A from accessing web service 2, once his IP address has been authenticated and authorized? "
This is trivial. Really. It is so trivial it hurts.
Imagine we are running a server with web service 1. Because in SOAP over HTTP, services are bound to endpoint URLs, this service has an Url that defnes the service :
http://example.com/axis/services/Service1
now lets add another service. It will have its own endpoint:
http://example.com/axis/services/Service2
Can you see where I am getting at yet?
If I want to let user A at service 1, and user B at service 2, then all I have to do is configure the web server that is hosting the Axis runtime so that the URLs have different security rights. That's all. Router side, I could do this by fiddling with arrowpoint security settings to restrict by IP address. But we want authentication, rather than just IPaddr filtering so what do we do?
We go to the servlet API spec and look up what it takes to add security to a pattern of URLs, and extend the web.xml of Axis to filter on URLs:
<security-constraint>
<web-resource-collection>
<web-resource-name>Service1</web-resource-name>
<url-pattern>/services/service1</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>service1</role-name>
</auth-constraint>
</security-constraint>
<security-constraint>
<web-resource-collection>
<web-resource-name>Service2</web-resource-name>
<url-pattern>/services/service2</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>service2</role-name>
</auth-constraint>
</security-constraint>
Now when anything hits service1 it gets a 401 response, "no auth", and has to respond with the authentication information before it gets through. With the appropriate configuration of the app server, such as this change to tomcat's server.xml:
<tomcat-users>
<user name="userA"
password="userA"
roles="service1" />
<user name="userB"
password="userB"
roles="service2" />
</tomcat-users>
we get an app server that only gives userB access to the service2 role, and userA access to the service1 role -and our services have their access restricted to the roles of the same name.
Thus the HTTP infrastructure that SOAP is running over is preventing anything from POSTing to the different endpoints.
Therefore I rest my case: you do not need extra security above and beyond HTTP (digest) and HTTPS to have encrypted and authenticated SOAP messaging over HTTP. I am not doing any "tricks that destroy interoperability" as you claimed. We, and by that I mean everyone who implements SOAP over HTTP client and server frameworks, are reusing the existing pieces of the HTTP infrastructure to offer people security they can understand.
The rationale for WS-security is not that HTTP security is inadequate; it is because some people want to move beyond HTTP as a transport. Once you change transports you have a different problem. But your 'figure 7' service is quite clearly an HTTP based solution, which you can secure quite easily today.
Like I said before: don't panic so much.
-steve
http://iseran.com/Steve
|