我将用户凭据从网络应用发布到网络API,后者实现了对用户进行身份验证并使用有效令牌进行响应的提供程序。
这是发布的方法:
public TokenModel RequestAPIToken(string username, string password)
{
var postData = new Dictionary<string, string>();
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<TokenModel>().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(&#34; application / x-www-form-urlencoded&#34;));
请问任何建议?
答案 0 :(得分:2)
问题无法通过您的代码轻松演示,因为您的代码中未显示其他原因,因此可能是null。
但是我会向你推荐这个主题token-based-authentication-asp-net-web-api-2-owin-asp-net-identity,它是一个5部分主题,涵盖了如何从a到z实现基于令牌的身份验证,你可以在开始时将你的代码与它的步骤进行比较从头开始。
正如你提到你遵循他的步骤,他在第2部分中介绍了如何使用Angular客户端获取令牌,并且在第1部分中他介绍了如何使用fiddler或postman获取令牌,因此您应该确定您的帖子请求拥有所需的标题和正文信息来生成令牌。
还尝试使用fiddler或浏览器网络工具收听您的网络客户端请求,并检查它是否包含正确的数据。
答案 1 :(得分:0)
两天来,我一直在撕扯我的头发并在阳光下尝试一切以使其发挥作用。
我的POST确实存在问题 postData.Add(&#34; username&#34;,username); postData.Add(&#34;密码&#34;,密码);
用户名后面有空格,密码后面有空格。在我注意到这一点后,我非常努力地面对自己。抱歉浪费你的时间。