URL编码表单数据

时间:2017-09-26 19:55:21

标签: c# angular asp.net-core

我的应用程序有一个表单,供用户输入一串内容和一个密钥,该密钥会发布到服务器并加密。向用户返回加密值。该应用程序允许他们使用密钥将加密的值发送回服务器,服务器将解密数据并将其发送回响应。

我可以成功发布数据以进行加密并获取我的回复。我遇到的问题是,当用户发回加密数据时,加密数据包含需要进行URL编码的字符。

这是请求加密的Angular 4服务功能。

    encrypt(data: CryptoData): Promise<Result> {
        let urlParameters = new URLSearchParams();
        urlParameters.append('content', data.content);
        urlParameters.append('key', data.key);
        let body = urlParameters.toString();

        return this.http
        .post('/api/encrypt', body, this.options)
        .toPromise()
        .then(response => 
        {
            return response.json();
        });
    }

这会取回加密结果。使用ContentKey值:

  

内容:Foo Bar

     

键:测试键

     

结果:AAAAABAAAACUdwXxU1tfClnbpOaKEqNVPuZSxL + cawqTxH + ZAFmDlBAAAAD6o / EFwKE9aDIU1WLOCDtBbY7ERTiKgsXr4pnsvkm + Et + qpJwLORrvPn9QzmJ1uFI =

结果有一个Base64字符串,它包含我需要在用户发回数据时进行URL编码的字符,例如+

处理此问题的角度方法是什么?后端服务器是ASP.Net Core,我可以改变我的实现方式,以处理Angular端的任何更改。目前,我使用此功能发布数据,这会导致+个字符替换为空格。

export class EncryptService implements OnInit {
    private options: RequestOptions;

    constructor(private http: Http) {
        this.options = new RequestOptions({
                headers: new Headers({ 'Content-Type': 'application/x-www-form-urlencoded' })
            })
    }

    decrypt(data: CryptoData) {
        let urlParameters = new URLSearchParams();
        urlParameters.append('content', data.content);
        urlParameters.append('key', data.key);
        let body = urlParameters.toString();

        return this.http
        .post('/api/decrypt', body, this.options)
        .toPromise()
        .then(response => 
        {
            return response.json();
        });
    }
}

传入的接口如下所示:

export interface CryptoData {
    content: string;
    key: string;
}

我的ASP.Net Core API端点如下所示:

    [HttpPost("~/api/Decrypt")]
    public IActionResult Decrypt([FromForm] CryptoRequest request)
    {
        string content = request.Content;
        string key = request.Key;

        // .....
        return base.Ok();
    }

1 个答案:

答案 0 :(得分:1)

在base64上使用base64URL。

对于Angular,请使用base64URL。 运行npm install base64url 在导入下方的服务或组件中,添加以下内容:

const base64url = require('base64url');

像这样使用..

const b64URLresult = base64url(result);

有另一种方法可以使用Typings和Definitely Typed添加javascript包。首先在这个包中尝试使用,所以给出了上述解决方案。

在你的控制器里。使用Microsoft.AspNetCore.WebUtilities.Base64UrlDecode