在基于web的项目中,我使用基于OAuth令牌的身份验证。
如果对用户进行了身份验证,则生成一个访问令牌,如下所示。
{"access_token":"FFz_DC6zzEDD4mGOCk9172ijj3sGxCUWnk-tGanm9wGk76hMB8sHI8ImeWtdUKHHGNXv465ZSlbb-3fr_hr9DqUHc9Dm9OBI7XjJhdjdOpAGAGSFOpE0Y17LCEWTjCmEZotuf42Mpgl81ewoS7OlnH4b5w4PrtzJbIBpSAMoWObziL_U3mTkeFKvWrcWOfvlSCvhhBA9Dc3UTXv3HiHKWQk0T3-pvVy7ZuW2oac-IIuaq_GYaVkIZh7s9-YjX9KAL2Z9yfrPrVOQXZe_5OcNd7nS3tdT5odchEAiuWRYQ6t7Tfb2si4T6VdAe73OYefE0se1FeQsxbOiNaLyF8OwBqymEUzEG8tEHJ-cejVbhPw","token_type":"bearer","expires_in":1799,"as:client_id":"","user":"1","role":"1",".issued":"Thu, 16 Feb 2017 09:37:44 GMT",".expires":"Thu, 16 Feb 2017 10:07:44 GMT"}下面是api方法之一。
[Authorize]
[HttpGet]
[Route("{userId}/{type}/")]
public IHttpResponse GetCustomerDetails(int userId, string type)
{
//my api stuff
}我正在使用邮递员测试api。当我将参数作为
http://localhost:50684/api/customer/1/gold
--along the access token in token in header--它返回所需的json。
但是,如果我使用相同的令牌&传递customer id = 2,它仍然允许访问其他客户(使用id=2)。
http://localhost:50684/api/customer/2/gold
--Access token in header--它不应该允许使用id=2对用户访问资源,因为生成的访问令牌对于id =1的用户是有效的。
我怎样才能防止这个安全漏洞?
任何帮助/建议都受到高度赞赏。
谢谢
发布于 2017-02-16 10:36:10
问题是,您将userId作为一个参数发送,这本身就是一个糟糕的设计。
简单的解决方案是从上下文中获取当前用户。
[Authorize]
[HttpGet]
[Route("{type}/")]
public IHttpResponse GetCustomerDetails(string type)
{
var user = RequestContext.Principal.Identity.Name;
//my api stuff
}发布于 2017-02-16 10:14:48
您可以将用户id和令牌存储在某个存储区(session,db)。并编写自己的MVC授权文件,如Authorize过滤器,将令牌与存储在存储中的用户id进行比较。
发布于 2017-02-16 10:17:09
目前,WebApi不符合用户id和身份验证用户id的概念。它不应该,因为您唯一指定的是带有某些参数的控制器方法的路由。您只需要通过使用“授权”属性对用户进行身份验证,但是一旦授予了访问权限,就不会运行进一步的验证。要使该方法仅适用于特定的用户子集,您可以编写自己的通用验证(在本例中,根据控制器范围内的" user“属性可以访问的用户声明进行检查),或者使用一些开箱即用的外部实现来处理身份验证。
https://stackoverflow.com/questions/42270666
复制相似问题