2012-06-08 60 views
3

我不知道這是否是一個愚蠢的問題,但我該如何將asp.net身份驗證與「openlayers」結合起來?使用asp.net和iis在geoserver中進行身份驗證

我創建了一個登錄頁面中的OpenLayers認證(在C#中,服務器端),這是我的代碼

Uri uri = new Uri("http://"+username+":"+password+"@localhost:1979/geoserver/wms"); 
     if (uri.Scheme == Uri.UriSchemeHttp) 
     { 
      HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(uri); 
      request.Method = WebRequestMethods.Http.Post; 

      HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
      StreamReader reader = new StreamReader(response.GetResponseStream()); string tmp = reader.ReadToEnd(); 
      response.Close(); 
      Response.Write(tmp); 
     } 

我不知道這是否是正確的方法來解決我的問題,無論如何,如果我達到我的目標(在GeoServer的用戶名和密碼進行身份驗證),我怎麼可以用的OpenLayers結合這個認證,這是在用戶端(JavaScript)

在此先感謝

回答

4

要使用從JavaScript側面geoserever認證,你必須做出geoserver autentication servlet(j_spring_security_check)的一篇文章。嘗試使用此登錄功能:

 function login (options) { 
    // url del servlet del geoserver 
    var url = options.server + "/geoserver/j_spring_security_check"; 
    // parametros para el login 
    params = "username=" + options["user"] + "&password=" 
       + options["password"]; 

    var contentType = "application/x-www-form-urlencoded"; 
    //se inicializa la petición ajax 
    var ajax = $.ajax({ 
     data : params, 
     type : "POST", 
     contentType : contentType, 
     url : url 
    }); 
    // se ejecuta cuando la peticion finaliza 
    ajax.done(function() { 

     if ($.cookie("JSESSIONID") != null && options && options.success) { 
      options.success(); 
     } 
    }); 
    // si ocurrio un error al realizar la peticion 
    ajax.fail(function(data) { 
     if (options && options.failure) { 
      options.failure(data); 
     } 
    }); 
    // se ejecuta siempre al final de la petición, sin importar que esta 
    // haya fallado 
    ajax.always(function() { 
     if (options && options.always) { 
      options.always(); 
     } 
    }); 
}; 

而且用這種方式

login({ 
    user:"admin" //geoserver user 
    password: "adminPassword", 
    server : "http://192.168.10.1:8080", //geoserver host 
    success : function(){ 
     alert("Login OK!"); 
    }, 
    failure : function(){ 
     alert("Login fail!"); 
    } 
}); 
+0

不錯!這工作謝謝:) –

0

出於某種原因的GeoServer不正確2.7後,辦理認證直通。所以,我添加了一種方法來從服務器上的頁面方法登錄並將auth cookie保存在會話變量中。不漂亮,但它的作品。

  'Post a login request to GS. 
     Dim myCookies As String = "" 
     Dim Method As String = "POST" 

     Dim HttpWRequest As System.Net.HttpWebRequest = CType(WebRequest.Create("https://" & GSServer & "/geoserver/j_spring_security_check"), HttpWebRequest) 

     Dim PostData As String = "username=" + UID + "&password=" + PWD 
     HttpWRequest.KeepAlive = False 
     HttpWRequest.Headers.Set("Pragma", "no-cache") 
     'HttpWRequest.Headers.Set("Translate", "f") 
     HttpWRequest.ContentType = "text/xml" 
     HttpWRequest.ContentLength = PostData.Length 

     'This is important, otherwise j_spring security check does an immediate redirect, and the cookie is lost. 
     HttpWRequest.AllowAutoRedirect = False 

     If String.IsNullOrEmpty(UID) = False Then 
      HttpWRequest.Credentials = New NetworkCredential(UID, PWD) 
     End If 

     If String.IsNullOrEmpty(myCookies) = False Then 
      HttpWRequest.Headers("Cookie") = myCookies 
     End If 

     'Set the request timeout to 5 minutes. 
     HttpWRequest.Timeout = 300000 
     ' set the request method 
     HttpWRequest.Method = Method 

     If Method = "POST" Or Method = "PUT" Then 
      ' Store the data in a byte array. 
      Dim ByteQuery() As Byte = System.Text.Encoding.ASCII.GetBytes(PostData) 
      HttpWRequest.ContentLength = ByteQuery.Length 
      Dim QueryStream As Stream = Nothing 
      Try 
       QueryStream = HttpWRequest.GetRequestStream() 
      Catch e As Exception 
       'WriteToLog(e.Message) 
       Throw New ArgumentException("Couldn't log into GeoServer.") 
      End Try 
      ' Write the data to be posted to the Request stream. 
      QueryStream.Write(ByteQuery, 0, ByteQuery.Length) 
      QueryStream.Close() 
     End If 

     ' Send the request and get a response. 

     Dim HttpWResponse As HttpWebResponse 
     Try 
      HttpWResponse = HttpWRequest.GetResponse() 
     Catch e As Exception 
      'WriteToLog(e.Message) 
      Throw New ArgumentException("Couldn't log into GeoServer.") 
     End Try 

     ' Get the Response stream. 
     Dim strm As Stream = HttpWResponse.GetResponseStream() 

     ' Read the Response stream. 
     Dim sr As StreamReader = New StreamReader(strm) 
     Dim sText As String = sr.ReadToEnd() 



     ' Close the stream. 
     strm.Close() 

     myCookies = HttpWResponse.GetResponseHeader("Set-Cookie") 
     HttpContext.Current.Session("GeoServerSessionID") = myCookies 
     ' Clean up. 
     HttpWRequest = Nothing 
     HttpWResponse = Nothing 

     If sText.Contains("Invalid username/password combination") Or String.IsNullOrEmpty(myCookies) Then 
      Throw New ArgumentException("Couldn't log into GeoServer.") 
     End If 
相關問題