2014-02-11 195 views
0

我已經將WCF服務添加到IIS上託管的現有ASP.NET網站。此服務的用戶是我的註冊用戶,他們的憑據存儲在我的SQL Server數據庫中。我只是希望在通過WCF服務提供數據之前用戶名和密碼來驗證有效的用戶。我經歷了網絡上的大量鏈接和文字,但我無法掌握認證和授權中給出的內容,除非增加我的疑惑。在初始階段,我沒有使用HTTPS和證書。使用用戶名和密碼驗證wcf服務用戶

我想要一個簡單的解決方案,服務的用戶在每次調用API時都會傳遞用戶名和密碼。我將收到這些憑證,根據我的SQL服務器數據庫進行驗證並相應地提供XML/JSON數據。 API調用將以AJAX/JQuery的形式從瀏覽器或移動客戶端獲得。如果可能,我希望客戶端通過HTTP標頭中的憑據而不是查詢字符串,並且在服務器端從HTTP標頭中檢索用戶憑據。

任何示例的簡單方法將不勝感激。

請注意,我不是.NET開發或Web服務方面的專家。

非常感謝!

+0

轉到WCF REST。這很容易。 –

+0

嗨Faizan謝謝!我正在使用WCF REST。你能解釋一下如何傳遞用戶名密碼並檢索服務中的相同內容。 – RamKr

+0

感謝您的寶貴意見!我已經成功地在http請求中使用來自客戶端html文件的Ajax/JQuery添加了Authorization標頭,並且還檢索了wcf端的用戶憑證。現在還有一個問題想到,wcf方面有沒有什麼方法可以知道用戶是否沒有提供授權頭並自動發送401,而不是進一步處理請求。 – RamKr

回答

0

好的!這是GET方法,儘管強烈建議不要在查詢字符串中發送用戶名和密碼,但要爲您提供啓動器,您可以使用它。

定義你的合同:

[ServiceContract] 
public interface IMyService 
{   
    [OperationContract] 
    [WebGet(UriTemplate = "/username={username}&password={password}", 
     ResponseFormat = WebMessageFormat.XML, 
     BodyStyle = WebMessageBodyStyle.Bare)] 
    string MyMethod(string username, string password);   
} 

而在你的實現方法,可以檢索相同的用戶名和密碼。

public class MyServiceImpl:IMyService 
{ 
    public string MyMethod(string username, string password) 
    { 
     return "You entered "+username +" and "+password; // This will returned as an XML. 
    } 
} 

更改的Web.Config像:

<?xml version="1.0"?> 
<configuration> 
    <appSettings>   
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />  
    </appSettings> 
    <system.web> 
    <compilation debug="true" targetFramework="4.5" /> 
    <httpRuntime targetFramework="4.5" maxRequestLength="2147483647" executionTimeout="300"/> 
    </system.web> 
    <system.serviceModel> 
    <services> 
     <service behaviorConfiguration="" name="Namespace.MyService"> 
     <endpoint address="" behaviorConfiguration="RESTBehavior" binding="webHttpBinding" 
      bindingConfiguration="webHttpBG" contract="Namespace.Name.IMyService" /> 
     <host> 
      <baseAddresses> 
      <add baseAddress="http://localhost:51855/MyService.svc" /> 
      </baseAddresses> 
     </host> 
     </service> 
    </services> 
     <bindings> 
      <webHttpBinding> 
       <binding name="webHttpBG" maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" 
    maxBufferPoolSize="21474836470" closeTimeout="00:01:00" openTimeout="00:01:00" 
       receiveTimeout="00:10:00" sendTimeout="00:01:00"> 
        <security mode="None"/> 
       </binding>     
     </webHttpBinding> 
    </bindings> 
<behaviors> 
    <endpointBehaviors> 
    <behavior name="RESTBehavior"> 
     <webHttp helpEnabled="true"/> 
    </behavior> 
    </endpointBehaviors> 
    <serviceBehaviors> 
    <behavior> 
     <!-- To avoid disclosing metadata information, set the values below to false before deployment --> 
     <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/> 
     <!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information --> 
     <serviceDebug includeExceptionDetailInFaults="false"/> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 
<protocolMapping> 
    <add binding="webHttpBinding" scheme="http" bindingConfiguration="webHttpBG" /> 
</protocolMapping>  
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" /> 

並進行測試,您可以使用瀏覽器。在Web.Config文件中定義類型url。例如

http://localhost:51855/MyService.svc/username=myname&password=123 

當你鍵入瀏覽器這個網址並回車就會打電話給你「的MyMethod」提供服務正在運行。

您也可以使用Fiddler來測試您的服務。

+0

非常感謝Faizan!我可以通過http標頭種類來傳遞用戶名和密碼,因爲我有更多的查詢字符串參數用於過濾數據。如果是,那麼如何通過並檢索相同的服務。謝謝。 – RamKr

+0

看到這個設置標頭http://msdn.microsoft.com/en-us/library/gg258441(v=vs.110).aspx,你可以在WCF方法使用IncomingWebRequestContext請求= WebOperationContext.Current.IncomingRequest; WebHeaderCollection headers = request.Headers; –