将电子邮件地址作为路由参数传递不起作用
Passing email address as a route parameter is not working
我正在研究 ASP.NET Core 3.1 API
我想将用户的电子邮件地址作为 url(查询字符串)的一部分传入,并让 API 查找他们的密码哈希和 return 电子邮件和在 JSON.
中给我的密码
我的代码有效,但是,我得到了电子邮件地址的奇数值。它要么封装在“/”“”中,要么显示变量“email”而不是电子邮件地址 test@test.com.
我可能没有正确书写 url 或者它无法处理电子邮件地址中的 @ 和句点?
https://localhost:5001/api/User/test@test.com
无效。
https://localhost:5001/api/User/"test@test.com"
returns: {"email":"\"test@test.com\"","passhash":"12121212121212"}
我要"email":"test@test.com"
前后没有"\"
https://localhost:5001/api/User/email?email=test@test.com
returns: {"email":"email","passhash":"12121212121212"}
我想要“电子邮件”:“test@test.com”而不是“电子邮件”:“电子邮件”
我的用户控制器:
[HttpGet("{email}")]
public async Task<IActionResult> Get(string email)
{
email = email.ToString();
IUsers user = new Users();
IDictionary<string, string> fetch = await Task.Run(() => user.FetchUser(email));
System.Diagnostics.Debug.WriteLine("Fetch User - " + fetch);
if (fetch["passhash"] != null)
{
// send back the user's email and passhash only if passhash isn't null
return Ok(fetch);
}
else
{
// if passhash is null, send back a bad request HTTP 400.
return BadRequest();
}
}
访问数据库的FetchUser方法:
IDictionary<string, string> IUsers.FetchUser(string email)
{
using (dbConnection)
{
//SQL Command
string cmd = String.Format(@"select u.passhash from users u where email={0}", email);
// Save results to result.
string passhash = dbConnection.Query<string>(cmd).FirstOrDefault();
IDictionary<string, string> fetchedUser = new Dictionary<string, string>();
if (passhash != null)
{
// Add the result to the Dictionary
fetchedUser.Add( "email", email);
fetchedUser.Add("passhash", passhash);
System.Diagnostics.Debug.WriteLine("User {0} passhash was fetched", email);
}
else
{
// Add null result to the Dictionary
// I'll use this to signal that there was no match.
fetchedUser.Add("email", email);
fetchedUser.Add("passhash", null);
System.Diagnostics.Debug.WriteLine("User {0} provided incorrect passhash", email);
}
System.Diagnostics.Debug.WriteLine(Environment.NewLine);
return fetchedUser;
}
}
如有任何建议,我们将不胜感激:)
仅供参考:
我正在散列用户密码并将其存储在数据库中,因此我只需要发送散列而不是密码。用户提供的密码将被散列,如果它们都匹配则它们是好的。
我打算在访问 API 之前使用 JWT 令牌进行 [授权],并使用 https 连接来使发送电子邮件和 passhash 更加安全。
更改此行:
string cmd = String.Format(@"select u.passhash from users u where email={0}", email);
至:
string cmd = String.Format(@"select u.passhash from users u where email='{0}'", email);
它可能会解决您当前的问题,但是:
停止将参数加入查询字符串!这将导致 sql 注入。
改用参数化查询。
你可以使用这个 url:
https://localhost:5001/api/User/"test@test.com"
但修正你的动作:
[HttpGet("{email}")]
public async Task<IActionResult> Get(string email)
{
var email = email.Trim('"');
....your code
它应该可以正常工作,但如果您仍然遇到问题,请尝试:
[HttpGet("{email}")]
public async Task<IActionResult> Get(string email)
{
var email = email.Trim('"');
string cmd = String.Format(@"select u.passhash from users u where email='{0}'", email);
....your code
````
我正在研究 ASP.NET Core 3.1 API
我想将用户的电子邮件地址作为 url(查询字符串)的一部分传入,并让 API 查找他们的密码哈希和 return 电子邮件和在 JSON.
中给我的密码我的代码有效,但是,我得到了电子邮件地址的奇数值。它要么封装在“/”“”中,要么显示变量“email”而不是电子邮件地址 test@test.com.
我可能没有正确书写 url 或者它无法处理电子邮件地址中的 @ 和句点?
https://localhost:5001/api/User/test@test.com
无效。
https://localhost:5001/api/User/"test@test.com"
returns: {"email":"\"test@test.com\"","passhash":"12121212121212"}
我要"email":"test@test.com"
前后没有"\"https://localhost:5001/api/User/email?email=test@test.com
returns: {"email":"email","passhash":"12121212121212"}
我想要“电子邮件”:“test@test.com”而不是“电子邮件”:“电子邮件”
我的用户控制器:
[HttpGet("{email}")]
public async Task<IActionResult> Get(string email)
{
email = email.ToString();
IUsers user = new Users();
IDictionary<string, string> fetch = await Task.Run(() => user.FetchUser(email));
System.Diagnostics.Debug.WriteLine("Fetch User - " + fetch);
if (fetch["passhash"] != null)
{
// send back the user's email and passhash only if passhash isn't null
return Ok(fetch);
}
else
{
// if passhash is null, send back a bad request HTTP 400.
return BadRequest();
}
}
访问数据库的FetchUser方法:
IDictionary<string, string> IUsers.FetchUser(string email)
{
using (dbConnection)
{
//SQL Command
string cmd = String.Format(@"select u.passhash from users u where email={0}", email);
// Save results to result.
string passhash = dbConnection.Query<string>(cmd).FirstOrDefault();
IDictionary<string, string> fetchedUser = new Dictionary<string, string>();
if (passhash != null)
{
// Add the result to the Dictionary
fetchedUser.Add( "email", email);
fetchedUser.Add("passhash", passhash);
System.Diagnostics.Debug.WriteLine("User {0} passhash was fetched", email);
}
else
{
// Add null result to the Dictionary
// I'll use this to signal that there was no match.
fetchedUser.Add("email", email);
fetchedUser.Add("passhash", null);
System.Diagnostics.Debug.WriteLine("User {0} provided incorrect passhash", email);
}
System.Diagnostics.Debug.WriteLine(Environment.NewLine);
return fetchedUser;
}
}
如有任何建议,我们将不胜感激:)
仅供参考:
我正在散列用户密码并将其存储在数据库中,因此我只需要发送散列而不是密码。用户提供的密码将被散列,如果它们都匹配则它们是好的。
我打算在访问 API 之前使用 JWT 令牌进行 [授权],并使用 https 连接来使发送电子邮件和 passhash 更加安全。
更改此行:
string cmd = String.Format(@"select u.passhash from users u where email={0}", email);
至:
string cmd = String.Format(@"select u.passhash from users u where email='{0}'", email);
它可能会解决您当前的问题,但是:
停止将参数加入查询字符串!这将导致 sql 注入。
改用参数化查询。
你可以使用这个 url:
https://localhost:5001/api/User/"test@test.com"
但修正你的动作:
[HttpGet("{email}")]
public async Task<IActionResult> Get(string email)
{
var email = email.Trim('"');
....your code
它应该可以正常工作,但如果您仍然遇到问题,请尝试:
[HttpGet("{email}")]
public async Task<IActionResult> Get(string email)
{
var email = email.Trim('"');
string cmd = String.Format(@"select u.passhash from users u where email='{0}'", email);
....your code
````