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

Asp.net core 将电子邮件地址作为路由参数传递不起作用,asp.net-core,asp.net-core-webapi,url-parameters,asp.net-apicontroller,Asp.net Core,Asp.net Core Webapi,Url Parameters,Asp.net Apicontroller,我正在开发ASP.NET Core 3.1 API 我希望将用户的电子邮件地址作为url(查询字符串)的一部分传入,并让API查找他们的密码散列,然后以JSON格式将电子邮件和密码散列返回给我 我的代码可以工作,但是,我的电子邮件地址有一些奇怪的值。它要么封装在“/”中,要么显示变量“email”,而不是电子邮件地址test@test.com. 我可能没有正确写入url,或者它无法处理电子邮件地址中的@和句点 https://localhost:5001/api/User/test@test.c

我正在开发ASP.NET Core 3.1 API

我希望将用户的电子邮件地址作为url(查询字符串)的一部分传入,并让API查找他们的密码散列,然后以JSON格式将电子邮件和密码散列返回给我

我的代码可以工作,但是,我的电子邮件地址有一些奇怪的值。它要么封装在“/”中,要么显示变量“email”,而不是电子邮件地址test@test.com.

我可能没有正确写入url,或者它无法处理电子邮件地址中的@和句点

https://localhost:5001/api/User/test@test.com

不起作用

https://localhost:5001/api/User/"test@test.com“

返回:{“电子邮件”:“\”test@test.com\“”,“passhash”:“12121212”}

我想要“电子邮件”:test@test.com“否”\“之前或之后

https://localhost:5001/api/User/email?email=test@test.com

返回:{“email”:“email”,“passhash”:“12121212”}

我想要“电子邮件”:test@test.com不是“电子邮件”:“电子邮件”

我的用户控制器:

[HttpGet(“{email}”)]
公共异步任务获取(字符串电子邮件)
{
email=email.ToString();
IUsers user=新用户();
IDictionary fetch=wait Task.Run(()=>user.FetchUser(email));
System.Diagnostics.Debug.WriteLine(“获取用户-”+Fetch);
if(fetch[“passhash”]!=null)
{
//仅当passhash不为null时才发回用户的电子邮件和passhash
返回Ok(获取);
}
其他的
{
//如果passhash为null,则返回错误的请求HTTP 400。
返回请求();
}
}
访问数据库的FetchUser方法:

IDictionary IUsers.FetchUser(字符串电子邮件)
{
使用(数据库连接)
{
//SQL命令
string cmd=string.Format(@“select u.passhash from users u where email={0}”,email);
//将结果保存到结果。
字符串passhash=dbConnection.Query(cmd.FirstOrDefault();
IDictionary fetchedUser=新字典();
if(passhash!=null)
{
//将结果添加到字典中
fetchedUser.Add(“email”,email);
fetchedUser.Add(“passhash”,passhash);
System.Diagnostics.Debug.WriteLine(“获取了用户{0}passhash”,电子邮件);
}
其他的
{
//将空结果添加到字典
//我会用这个来表示没有对手。
fetchedUser.Add(“email”,email);
fetchedUser.Add(“passhash”,null);
System.Diagnostics.Debug.WriteLine(“用户{0}提供了不正确的passhash”,电子邮件);
}
System.Diagnostics.Debug.WriteLine(Environment.NewLine);
返回fetchedUser;
}
}
如有任何建议,敬请告知:)

供参考:

我正在散列用户的密码并将其存储在数据库中,因此我只需要发送散列而不是密码。用户提供的密码将被散列,如果它们都匹配,则它们是好的

我打算在访问API之前使用JWT令牌[授权],并使用https连接使发送电子邮件和passhash更加安全。

更改此行:

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}”)]
公共异步任务获取(字符串电子邮件)
{
var email=email.Trim(“”);
……你的密码
它应该可以正常工作,但如果仍然存在一些问题,请尝试:

[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

````
[HttpGet(“{email}”)]
公共异步任务获取(字符串电子邮件)
{
var email=email.Trim(“”);
string cmd=string.Format(@“从用户u中选择u.passhash,其中email='{0}',email);
……你的密码
````

“我正在对用户密码进行哈希运算并将其存储在数据库中,因此我只需要发送哈希值而不是密码”-因此散列成为密码。这到底解决了什么问题?此外,您有一个巨大的SQL注入漏洞,而您的问题是由SQL中缺少引号引起的。请改用参数化查询,或者更确切地说,如果您不知道自己在做什么,请不要滚动您自己的身份验证。使用
h时会发生什么ttps://localhost:5001/api/User/test@test.com
?它对我有效。“不起作用”-是一个非常模糊的问题描述。谢谢你的回答。我按照你的建议使用参数化查询来工作。
string cmd=string.Format(@“select u.passhash from users u where email=@email”);string passhash=dbConnection.Query(cmd,new{Email=Email}).FirstOrDefault();
现在它可以与这个url一起工作:感谢您的回复,它确实可以工作,但是使用参数化SQL查询效果最好
[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

````