将电子邮件地址作为路由参数传递不起作用

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

````