C#Web API& Android应用程序 - 使用Cookie在POST时无法解密错误防伪令牌

时间:2014-05-02 09:57:36

标签: c# android post cookies antiforgerytoken

好的,继续我上一个问题,我说过在Android HttpPost中添加一个Cookie并不困难:这很难(比我想象的还要好)..

我在Android应用中使用以下HttpPost方法:

@Override
protected String doInBackground(String... urls){
    String response = "";
    for(String url : urls){
        HttpPost post = new HttpPost(url);
        try{
            URL u = new URL(url);
            String baseUrl = u.getProtocol() + "://" + u.getHost();

            // POST-request requires anti-forgery Cookie
            CookieManager cookieManager = CookieManager.getInstance();
            String cookie = cookieManager.getCookie(baseUrl);
            post.setHeader("Cookie", cookie);

            // POST-request requires cookieToken, provider and returnUrl
            String[] cookieStrings = cookie.split("=");
            List<NameValuePair> nvPairs = new ArrayList<NameValuePair>(3);
            nvPairs.add(new BasicNameValuePair(cookieStrings[0], cookieStrings[1]));
            nvPairs.add(new BasicNameValuePair("provider", "Google"));
            nvPairs.add(new BasicNameValuePair("returnUrl", baseUrl));
            post.setEntity(new UrlEncodedFormEntity(nvPairs));

            HttpResponse execute = client.execute(post);

            // Get the response of the POST-request
            InputStream content = execute.getEntity().getContent();
            BufferedReader buffer = new BufferedReader(new InputStreamReader(content));
            String s = "";
            while((s = buffer.readLine()) != null)
                response += s;
        }
        catch(Exception ex){
            ex.printStackTrace();
        }
    }
    return response;
}

当我调试response时,我收到以下错误:

  

无法解密防伪令牌。如果这个应用程序是   由Web场或群集托管,确保所有计算机都在运行   相同版本的ASP.NET网页和&lt; machineKey&gt;   configuration指定显式加密和验证密钥。   无法在群集中使用AutoGenerate。

我已用Google搜索此错误并找到this link。他们在这里向C#machineKey添加Web.config。我检查过,这个machineKey已经存在于我的Web API的C#项目中。

因此,阅读上述错误后,我认为这是因为我只是从Android应用程序运行HttpPostHttpGet请求(即 { {1}} 部分?我在这方面是否正确?

更重要的是,如何在Android中修复此错误,以便我可以成功发送Web Farm or cluster + Cookie,因此我已使用CookieToken登录。因此,我可以开始使用来自同一POST-request GET-requests的{​​{1}}。

提前感谢您的回复。


编辑1:

阅读this stackoverflow question的答案后:

  • 我在一个页面上没有多个[Authorized]
  • 如前所述,DefaultHttpClient已添加到@Html.AntiForgeryToken()

1 个答案:

答案 0 :(得分:0)

好的,这个错误已经解决了。原来我有三个cookie而不是一个,所以使用string-split我有一个下一个cookie的部分字符串令牌。现在通过单独获取所有cookie(使用&#34 ;;&#34;分割),然后使用&#34; =&#34;分割正确的cookie来解决这个问题。发送它。

然而,在我这样做之后,如果收到下一个错误:

  

验证提供的防伪令牌失败。饼干   &#34; __ RequestVerificationToken&#34;和表格领域   &#34; __ RequestVerificationToken&#34;交换了。

但至少我可以再次继续,上面的错误就解决了。