12

我试图为此找到解决方案,但所有即将出现的解决方案都是针对以前版本的 ASP.Net。

我正在使用 JWT 身份验证中间件并具有以下方法:

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

这会像获取表单数据一样获取发送的数据,但我的 Angular 2 前端将数据作为 JSON 发送。

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 发送,但我未能成功检索数据。我知道它正在发送,因为我可以在 fiddler 中看到它,如果我使用 Postman 并且只发送表单数据,它就可以正常工作。

基本上我只需要弄清楚如何改变这一行来读取 json 数据

var username = context.Request.Form["username"];
4

1 回答 1

13

当它到达你的中间件时,请求流已经被读取,所以你可以在这里做的是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();
    ...
    }
于 2017-03-21T09:09:27.293 回答