8

私はこれのための解決策を見つけようとしましたが、すべてのものは以前のバージョンのASP.Net用です。ASP.NetのJSON投稿データを読んでください。コアMVC

私はJWT認証ミドルウェアと連携し、以下の方法で持っている:それはフォームデータであるかのように、これは、送信されたデータを取得しますが、私の角度2フロントエンドがJSONとしてデータを送信している

private async Task GenerateToken(HttpContext context) 
{ 
    var username = context.Request.Form["username"]; 
    var password = context.Request.Form["password"]; 
    //Remainder of login code 
} 

を。

login(username: string, password: string): Observable<boolean> { 
    let headers = new Headers({ 'Content-Type': 'application/json' }); 
    let options = new RequestOptions({ headers: headers }); 
    let body = JSON.stringify({ username: username, password: password }); 
        return this.http.post(this._api.apiUrl + 'token', body, options) 
            .map((response: Response) => { 
                 
            }); 
    } 

私の好みの解決策は、JSONとして送信することですが、データの取得に失敗しました。私はそれが送信していることを知っています。私はそれをフィドラーで見ることができるからです。そして、私がPostmanを使用してフォームデータを送信すればうまくいきます。

基本的に私はちょうどあなたがここに何ができるかを要求ストリームがすでに読み込まれている、それはあなたのミドルウェアになる頃には、JSONデータ

var username = context.Request.Form["username"]; 
+0

あなたはちょうどあなたがJSON –

+0

のContent-Type 'アプリケーション/ X-WWW-フォームurlencoded'とちょうどURLエンコードを使用する機能にログイン切り替わらないなぜ私は全体をしたいと思いますフロントエンドはjsonを使用するのではなくjsonを送信できるようになり、いくつかはフォームデータを使用します。実際にこのルートを試してみましたが、データをフォームデータとして正しく送信するのは苦労していました。例を挙げても、私は両者が正しく話すことができませんでした。 – Jhorra

+0

あなたはこれを行うだけではいけませんか? 'encodeURIComponent(JSON.stringify({username:username、password:password}));' –

答えて

7

を読み取るために、この行を変更する方法を見つけ出す必要があるので、 Microsoft.AspNetCore.Http.Internal.EnableRewindリクエスト上にあり、それを自分で読んで

広いサイト:

Startup.cs 
using Microsoft.AspNetCore.Http.Internal; 

Startup.Configure(...){ 
... 
//Its important the rewind us added before UseMvc 
app.Use(next => context => { context.Request.EnableRewind(); return next(context); }); 
app.UseMvc() 
... 
} 

または選択:

private async Task GenerateToken(HttpContext context) 
    { 
    context.Request.EnableRewind(); 
    string jsonData = new StreamReader(context.Request.Body).ReadToEnd(); 
    ... 
    } 
+0

ミドルウェアと 'GenerateToken'メソッドの両方で' EnableRewind'を呼び出すのはなぜですか? –

+0

良い点@JimAho - 編集済みです。 –

+1

2つ目のオプションでは、これら2行の間に 'context.Request.Body.Position = 0;'を追加する必要があります。それ以外の場合は、サーバーが既に本体の最後に達しているため、リーダーは空の文字列を返します。 –

関連する問題