2009-05-21 11 views
5

Existe-t-il une méthode recommandée (et de préférence gratuite) dans ColdFusion pour accéder à un fichier distant protégé par l'authentification NTLM? La balise cfhttp semble uniquement prendre en charge l'authentification de base.Authentification NTLM dans ColdFusion

Répondre

4

Cette étiquette CFX - CFX_HTTP5 - devrait faire ce que vous avez besoin. Cela coûte 50 $, mais peut-être que ça vaut le coût? On dirait un petit prix à payer.

+0

+1 Il est comme je l'ai fait une fois. Fonctionne bien! –

+0

Ce n'est pas une mauvaise solution; Je l'ai utilisé dans le passé et cela fonctionne. Ce que je voudrais éviter, ce n'est pas tellement le coût monétaire, mais le coût de la maintenance des licences et une dépendance externe. – Soldarnal

+0

Eh bien, vous ne pouvez pas le faire de manière native dans CF, donc vous avez besoin d'une solution tierce comme celle-ci ou vous avez besoin de la vôtre. – ale

1

Voici un code que je trouve dans:

http://www.bpurcell.org/downloads/presentations/securing_cfapps_examples.zip

Il y a aussi des exemples pour ldap, webservices, et plus .. je vais coller 2 fichiers ici afin que vous puissiez avoir une idée, regarde de code comme ça devrait encore fonctionner.

<cfapplication name="example2" sessionmanagement="Yes" loginStorage="Session"> 
<!-- Application.cfm --> 
<!-- CFMX will check for authentication with each page request. --> 
<cfset Request.myDomain="allaire"> 

<cfif isdefined("url.logout")> 
    <CFLOGOUT> 
</cfif> 


<cflogin> 
    <cfif not IsDefined("cflogin")> 
     <cfinclude template="loginform.cfm"> 
     <cfabort> 
    <cfelse> 
     <!--Invoke NTSecurity CFC --> 
     <cfinvoke component = "NTSecurity" method = "authenticateAndGetGroups" 
      returnVariable = "userRoles" domain = "#Request.myDomain#" 
      userid = "#cflogin.name#" passwd = "#cflogin.password#"> 
     <cfif userRoles NEQ ""> 
      <cfloginuser name = "#cflogin.name#" password = "#cflogin.password#" roles="#stripSpacesfromList(userRoles)#"> 
      <cfset session.displayroles=stripSpacesfromList(userRoles)><!--- for displaying roles only ---> 
     <cfelse> 
      <cfset loginmessage="Invalid Login"> 
      <cfinclude template="loginform.cfm"> 
      <cfabort> 
     </cfif> 
    </cfif> 
</cflogin> 

<!-- strips leading & trailing spaces from the list of roles that was returned --> 
<cffunction name="stripSpacesfromList"> 
    <cfargument name="myList"> 
    <cfset myArray=listtoarray(arguments.myList)> 
    <cfloop index="i" from="1" to="#arraylen(myArray)#" step="1"> 
     <!--- <cfset myArray[i]=replace(trim(myArray[i]), " ", "_")> 
     out<br>---> 
     <cfset myArray[i]=trim(myArray[i])> 
    </cfloop> 
    <cfset newList=arrayToList(myArray)> 
    <cfreturn newList> 
</cffunction> 

C'est le cfc qui pourrait être vous intéresser:

<!--- 
This component implements methods for use for NT Authentication and Authorization. 

$Log: NTSecurity.cfc,v $ 
Revision 1.1 2002/03/08 22:40:41 jking 
Revision 1.2 2002/06/26 22:46 Brandon Purcell 
component for authentication and authorization 
---> 

<cfcomponent name="NTSecurity" > 

     <!--- Authenticates the user and outputs true on success and false on failure. ---> 
     <cffunction name="authenticateUser" access="REMOTE" output="no" static="yes" hint="Authenticates the user." returntype="boolean"> 
       <cfargument name="userid" type="string" required="true" /> 
       <cfargument name="passwd" type="string" required="true" /> 
       <cfargument name="domain" type="string" required="true" /> 
       <cftry> 
         <cfscript> 
         ntauth = createObject("java", "jrun.security.NTAuth"); 
         ntauth.init(arguments.domain); 
         // authenticateUser throws an exception if it fails, 
         ntauth.authenticateUser(arguments.userid, arguments.passwd); 
         </cfscript> 

       <cfreturn true> 
       <cfcatch> 
       <cfreturn false> 
       </cfcatch> 
       </cftry> 
     </cffunction> 

     <!--- 
       Authenticates the user and outputs true on success and false on failure. 
     ---> 
     <cffunction access="remote" name="getUserGroups" output="false" returntype="string" hint="Gets user groups." static="yes"> 
       <cfargument name="userid" type="string" required="true" /> 
       <cfargument name="domain" type="string" required="true" /> 

       <cftry> 
         <cfscript> 
         ntauth = createObject("java", "jrun.security.NTAuth"); 
         ntauth.init(arguments.domain); 
         groups = ntauth.GetUserGroups(arguments.userid); 
         // note that groups is a java.util.list, which should be 
         // equiv to a CF array, but it's not right now??? 
         groups = trim(groups.toString()); 
         groups = mid(groups,2,len(groups)-2); 
         </cfscript> 
         <cfreturn groups> 
       <cfcatch> 
         <cflog text="Error in ntsecurity.cfc method getUserGroups - Error: #cfcatch.message#" type="Error" log="authentication" file="authentication" thread="yes" date="yes" time="yes" application="no"> 
         <cfreturn ""> 
       </cfcatch> 
       </cftry> 

     </cffunction> 

     <!--- 
       This method combines the functionality of authenticateUser and getUserGroups. 
     ---> 
     <cffunction access="remote" name="authenticateAndGetGroups" output="false" returntype="string" hint="Authenticates the user and gets user groups if it returns nothing the user is not authticated" static="yes"> 
       <cfargument name="userid" type="string" required="true" /> 
       <cfargument name="passwd" type="string" required="true" /> 
       <cfargument name="domain" type="string" required="true" /> 
       <cftry> 
         <cfscript> 
         ntauth = createObject("java", "jrun.security.NTAuth"); 
         ntauth.init(arguments.domain); 
         // authenticateUser throws an exception if it fails, 
         // so we don't have anything specific here 
         ntauth.authenticateUser(arguments.userid, arguments.passwd); 
         groups = ntauth.GetUserGroups(arguments.userid); 

         // note that groups is a java.util.list, which should be 
         // equiv to a CF array, but it's not right now 
         groups = trim(groups.toString()); 
         groups = mid(groups,2,len(groups)-2); 
         </cfscript>  
       <cfreturn groups> 
       <cfcatch> 
         <cfreturn ""> 
       </cfcatch> 
       </cftry> 

     </cffunction> 

</cfcomponent> 
+0

Cela semble plus pour si je veux sécuriser ma propre application avec NTLM. Ou est-ce que je comprends mal? – Soldarnal

+0

Désolé, j'ai mal lu la question! –

0

Vous pouvez essayer de suivre les conseils ici: http://cfsilence.com/blog/client/index.cfm/2008/3/17/ColdFusionSharepoint-Integration--Part-1--Authenticating

Voici ce que cela se résume à vous faire:

edit the client-config.wsdd 

changement

<transport 
    name="http" 
    pivot="java:org.apache.axis.transport.http.HTTPSender"> 
</transport> 

à

<transport 
    name="http" 
    pivot="java:org.apache.axis.transport.http.CommonsHTTPSender"> 
</transport> 
+0

Hmm, cela semblait prometteur, mais n'a pas fonctionné pour moi. Peut-être que CF utilise uniquement Axis lors de la création d'une requête SOAP? (J'essaie juste de saisir un fichier texte brut.) – Soldarnal

1

Si le code de Brandon Purcell qui utilise la classe jrun.security.NTauth ne fonctionne pas pour vous dans cf9 (il n'a pas pour moi) le correctif est d'utiliser la classe à la place coldfusion.security.NTAuthentication . Tout a bien fonctionné pour moi.

+0

Je viens de passer une demi-heure à essayer de trouver ce nom de classe! Merci!! –

Questions connexes