0

Wcf Web サービスと、サービス メソッドを呼び出す Android アプリケーションがあります。できればユーザー名とパスワードの組み合わせを使用して、何らかの認証を行う必要があります。データは機密ではありませんが、Android アプリケーションからのみサービスにアクセスできるようにする必要があります。どんな助けでも大歓迎です。

これに非常によく似た複数の方法があります

<OperationContract()> _
<WebInvoke(Method:="GET", ResponseFormat:=WebMessageFormat.Json, BodyStyle:=WebMessageBodyStyle.WrappedResponse, UriTemplate:="endpoint?busUnit={busUnit}")> _
Function lstJobsSVC(busUnit As String) As List(Of JobsView)

次に、次のようにサービスにメソッドを実装します

Public Function lstJobsSVC(busUnit As String) As List(Of JobsView) Implements IService1.lstJobsSVC
    Dim entities As New RemoteTimeEntities()
    WebOperationContext.Current.OutgoingResponse.ContentType = "application/json; charset=utf-8"

    Return entities.lstJobs(busUnit).ToList
End Function

そして、アンドロイドで

URL json = new URL("http://localhost/json/Service1.svc/"+ "functions endpoint";                 
                HttpURLConnection jc = (HttpURLConnection) json.openConnection();                   
                BufferedReader reader = new BufferedReader(new InputStreamReader(jc.getInputStream()));
                readLine = reader.readLine();
                JSONObject jsonResponse = new JSONObject(readLine);
                JSONArray jsonArray = jsonResponse.getJSONArray("get json array name");

これで、このコードはすべて正常に機能します。2 つの間で機能する認証を実装する方法がわかりません。

4

1 に答える 1

1

通話自体が正しく機能していると思います。その場合、クライアントを認証するための最も簡単な (それでも十分に安全な) 方法は次のようになります。

  1. クライアントはログインと、パスワードの SHA-1 または SHA-256 ハッシュを送信します (他のハッシュ アルゴリズムは使用しないでください。よく理解するまでは使用しないでください。SHA-256 オプションの方が優れています)。
  2. サーバーは、そのユーザーの対応するパスワード ハッシュを見つけ、それをクライアントから送信された値と比較します。ハッシュが同じであれば問題ありません。

この方法では、SSL 接続が完全に安全である必要があります (盗聴/リプレイ攻撃から保護するため)。

データをAndroid アプリのみに制限する必要がある場合は、サーバー アプリケーションとクライアント アプリケーションの両方でのみ認識される AES キーを使用してペイロードを暗号化する必要があります。CBC または CTR モードのみを使用してください。

必要に応じて、両方の方法を組み合わせることができます。ただし、セキュリティは非常に難しい問題であり、私が説明したアプローチは「非常に優れた」ものにすぎないことに注意してください。何をしているのか正確にわからない場合は、アプリに機密情報を入力しないでください。

于 2013-07-22T20:11:56.717 に答える