1

私は残りのWebサービスの世界ではまったく新しいもので、ASP.NETでREST Webサービスを実装しようとしてWeb上の記事をたくさん旅しました(並行して別のプロジェクトのWebフォームアプリケーションを使用)

WebServices はどの程度安全なのだろうか? ここで説明されているチュートリアルをセットアップします: http://www.codeproject.com/Articles/128478/Consuming-WCF-REST-Services-Using-jQuery-AJAX-Call

jquery を使用して Web サービスを呼び出すことはできますが、セキュリティはありません。

安全な HTTP ヘッダーを設定する必要がありますか? もしそうなら、どのように?

私が疑問に思っているもう 1 つのこと: HTML ページのソース コードを見る人は、「パスキー」または「ログイン」/「パスワード」を簡単に見つけることができますか?

あなたの助けが必要です:(ありがとう

編集 :

このコードを使用して、Rest サービスを jquery で呼び出します。

function setHeader(xhr) {
    var secretkey = "userid:uCMfSzkjue+HSDygYB5aEg==";
    var hashedUrl = secretkey;
    var hashedUrlBase64 = hashedUrl.toString();
    xhr.setRequestHeader('Authorization', hashedUrlBase64, "1234dgt");
}

$.ajax({
    cache: false,
    type: "GET",
    async: false,
    url: rootWS + "ListeService/GetListeSerie" + "(" + listeId + ")",
    //data: "{'id':'" + listeId + "'}",
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function (response) {
                ...
    },
    error: function (msg) {
        ...
    },
    beforeSend: setHeader

});

そして、このコードを私の REST WS に:

[WebInvoke(Method = "GET", UriTemplate = "GetListeSerie({id})")]
public List<SeriePourListe> GetListeSerie(string id)
{
    if (!Security.AuthenticateUser())
    {
        WebOperationContext.Current.OutgoingResponse.StatusCode = HttpStatusCode.Unauthorized;
        return null;
    }

    //do some stuff
}

public static class Security
{
    public static bool AuthenticateUser()
    {
        WebOperationContext ctx = WebOperationContext.Current;
        string requestUri = ctx.IncomingRequest.UriTemplateMatch.RequestUri.ToString();
        string authHeader = ctx.IncomingRequest.Headers[HttpRequestHeader.Authorization];
        // if supplied hash is valid, user is authenticated
        if (IsValidUserKey(authHeader, requestUri))
            return true;
        return false;
    }
    public static bool IsValidUserKey(string key, string uri)
    {
        string[] authParts = key.Split(':');
        if (authParts.Length == 2)
        {
            string userid = authParts[0];
            string hash = authParts[1];
            if (ValidateHash(userid, uri, hash))
                return true;
        }
        return false;
    }

    private static bool ValidateHash(string userid, string uri, string hash)
    {
        if (!UserKeys.Contains(userid))
            return false;
        string userkey = userid;
        byte[] secretBytes = ASCIIEncoding.ASCII.GetBytes(userkey);
        HMACMD5 hmac = new HMACMD5(secretBytes);
        byte[] dataBytes = ASCIIEncoding.ASCII.GetBytes(uri);
        byte[] computedHash = hmac.ComputeHash(dataBytes);
        string computedHashString = Convert.ToBase64String(computedHash);
        return computedHashString.Equals(hash);
    }
}
4

2 に答える 2

1

だから私は自分のプロキシをコーディングしましたが、うまくいくようです:

[System.Web.Services.WebMethod()]
[System.Web.Script.Services.ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public static object Call(string WSUrl)
{
    // Create web client.
    WebClient client = new WebClient();
    client.Encoding = Encoding.UTF8;

    // Download string.
    JavaScriptSerializer serializer = new JavaScriptSerializer();
    return serializer.Deserialize<List<object>>(client.DownloadString(WSUrl));
}

そして、それは jquery でそのように呼び出すことができます:

$.ajax({
    type: "POST",
    url: "http://localhost:14892/common/proxy.aspx/call",
    data: "{'WSUrl':'" + rootWS + "ListeService/2/GetListeSerie" + "(" + listeId + ")" + "'}",
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function (response) {
        var result = response.d;
        var new_record = "";
        $.each(result, function (index, res) {
            new_record = serieListe(index + 1, res.Id, res.ImageUrl, res.SerieNom, res.SerieSynopsis, res.SerieUrl);
            $('#gridElementsListe').append(new_record);
        });
    },
    error: function (msg) {
        $('#msg').html("Error while calling web service,,")
    }
});

その助けを願っています。ここで、bphillips が提案するように、プロキシにセキュリティを追加します。優れたセキュリティ プロトコルを使用するためのアドバイスがあれば、遠慮なくここで共有してください ;)

于 2013-05-16T19:48:46.530 に答える