我在c#.Net 上构建了API
这些API运行良好,但并不安全,这意味着全世界的任何人都可以使用
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using System.Data.SqlClient;
using System.Data;
namespace CDAPIs.Controllers
{
public class CallSPController : ApiController
{
[Route("api/CallSP")]
public string Get(string SP = null, string Type = null, string Ps = null, string P0 = null, string P1 = null, string P2 = null, string P3 = null)
{
string sDBConn = Functions.GetConn();
string[] Parms = Ps.Split(',');
SqlConnection conn = new SqlConnection(sDBConn);
SqlCommand cmd = new SqlCommand(SP, conn);
cmd.CommandTimeout = 0;
cmd.CommandType = CommandType.StoredProcedure;
string P = "";
for (int i = 0; i < Parms.Length; i++)
{
if (i == 0) { P = P0; }
if (i == 1) { P = P1; }
if (i == 2) { P = P2; }
if (i == 3) { P = P3; }
cmd.Parameters.Add(new SqlParameter("@" + Parms[i].Trim(), P));
}
try
{
conn.Open();
if (Type.ToUpper().Trim() == "STRING")
{
string st = cmd.ExecuteScalar().ToString();
conn.Close();
conn.Dispose();
return st;
}
else
{
SqlDataReader rdr = cmd.ExecuteReader();
var dt = new DataTable();
dt.Load(rdr);
List<DataRow> result = dt.AsEnumerable().ToList();
rdr.Close();
conn.Close();
conn.Dispose();
string json = Functions.DataTableToJSON(dt);
//return Json(result, JsonRequestBehavior.AllowGet);
return json;
}
}
catch (Exception ex)
{
return ex.Message;
}
}
}
}
我想保护这些API,我想知道如何正确地进行
我考虑将UserID和Password添加到每个API中,以便使用将它们作为参数发送
所以它会像这个
[Route("api/CallSP")]
public string Get(string UserID, string Password, string SP = null, string Type = null, string Ps = null, string P0 = null, string P1 = null, string P2 = null, string P3 = null)
{
有更好的解决方案吗?
不,您不能在查询中发送密码等安全数据,因为这些数据很容易被盗。在这种情况下,您应该创建一个端点来验证用户并返回给用户的安全字符串。此安全字符串称为JWT令牌。之后,您将此令牌放入Authorization
标头中的每个请求中。如果API配置正确,并且您使用了[Authorize]
属性,那么您将自动将授权和步骤传递到您的方法中。您可以在这里找到最简单的代码示例(但文章使用不同的语言(。
您的用户应该进行一次身份验证,然后重新使用连接。您应该有一个login
操作,它将接受用户名和密码,生成会话id或类似的东西,并将其发送回客户端。从那时起,客户端应该使用会话ID进行身份验证,并且服务器应该知道会话ID。
因为,如果由于某种原因会话ID被盗,那么用户可能会被黑客临时冒充,但是,如果用户的凭据被盗,那么该用户可能会永远被锁定在其帐户之外。
因此:
- 会话ID应该是临时的,也就是说,在一周(或您的首选期限(到期后,您的应用程序不应该再信任旧的会话ID,并需要再次进行身份验证
- 所有请求都需要加密
- 在更改密码/用户名时,您的应用程序不应仅通过会话ID/令牌来满足要求,但也应要求进行正确的身份验证
- 如果你的应用程序与用户有一个沟通渠道,比如在注册时定义的电子邮件地址等,那就太好了