Web API令牌身份validation

我将用户凭据从Web应用程序发布到web api,该Web api实现了对用户进行身份validation并使用有效令牌进行响应的提供程序。

这是发布的方法:

public TokenModel RequestAPIToken(string username, string password) { var postData = new Dictionary(); postData.Add("grant_type", "password"); postData.Add("username ", username); postData.Add("password ", password); HttpContent content = new FormUrlEncodedContent(postData); _response = _client.PostAsync("token", content).Result; var result = _response.Content.ReadAsAsync().Result; return result; } 

这取自web api项目:

 public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context) { context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" }); var _userServices = new UserServices(); User user = _userServices.GetValidatedUser(context.UserName, context.Password).FirstOrDefault(); if (user == null) { context.SetError("invalid_grant", "The user name or password is incorrect."); return; } var identity = new ClaimsIdentity(context.Options.AuthenticationType); identity.AddClaim(new Claim("userId", user.UserId.ToString())); identity.AddClaim(new Claim("username", user.Username.ToString())); context.Validated(identity); } 

问题是context.UserName和context.Password总是为null! 我尝试使用键值对而不是dictinary而我正在使用_client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(“application / x-www-form-urlencoded”));

有什么建议吗?

您的代码无法轻易certificate此问题,因为代码中未显示的其他原因可能是null。

但我会向你推荐这个主题基于令牌的身份validation-asp-net-web-api-2-owin-asp-net-identity ,它是一个5部分主题,涵盖了如何从a到z实现基于令牌的身份validation你可以从头开始比较你的代码和它的步骤。

正如你提到你遵循他的步骤,他在第2部分中介绍了如何使用Angular客户端获取令牌,并且在第1部分中他介绍了如何使用fiddler或postman获取令牌,因此您应该确保您的post请求具有所需用于生成令牌的标头和正文信息。

还尝试使用fiddler或浏览器网络工具收听您的Web客户端请求,并检查它是否包含正确的数据。

两天以来,我一直在撕扯我的头发并在阳光下尝试一切以使其发挥作用。

问题确实在于我的POST postData.Add(“username”,username); postData.Add(“密码”,密码);

用户名后面有空格,密码后面有空格。 在我注意到这一点后,我非常努力地面对自己…抱歉浪费你的时间。