如何限制仅对我的应用程序的API访问?

时间:2018-03-23 15:04:20

标签: c# asp.net-web-api jwt

我已经为某些动作创建了一个api并实现了JWT。我遵循了一些教程并成功阻止了对非GET端点的未授权请求。每个教程似乎都涵盖了相同的概念:向用户发出请求。也就是说,我获取了他们的用户名/密码,请求令牌,验证该令牌,然后执行操作。

问题在于我不希望公众能够向api发出GET个请求。我也不希望他们登录应用程序,因为没有必要。

我可能也会在网站上使用一些ajax,我不确定这是否会让事情变得复杂。

我是否应该使用"应用程序"用户名密码?或者是否有一种标准方法来限制api请求到应用程序?

3 个答案:

答案 0 :(得分:1)

看看你的场景,我说你肯定要考虑IdentityServer。

这将允许您跳过OAuth2背后的大部分复杂性。我已经看到很多人提到OAuth2流量过大,但它是一个标准,如果你花一些时间来理解它,那么你会发现它实际上并不那么难。 / p>

这对您的情况有何影响?

您希望使用应用程序身份验证,因为您不关心登录的用户。这意味着您将定义ClientID和ClientSecret组合,这将有助于识别一个应用程序。如果您有多个应用程序,只需创建更多组合。

您将向Authorization Server发出初始请求,并在Basic Authorization标头中传递ClientID和CLientSecret。

您将获得一个令牌,该令牌允许您在指定的时间段内访问您的资源。您可以使用Bearer Authorization标头使用从授权服务器收到的令牌访问您的资源。

基本上就是这样。一个好的资源是Taiseer's blog。我强烈推荐它,因为这个人是Microsoft MVP并且在这个特定领域做了很多工作。

我有一篇使用Identity v3的旧文章。它现在已经过时但它确实详细解释了所有内容,所以你可能也想看看它:

Andrei's article

我建议远离任何自定义安全系统,因为这些系统不是经过强化的,而且在野外并没有真正得到证实。用一个小错误揭露自己很容易。

答案 1 :(得分:0)

我们在这里谈论的内容似乎是基于用户身份创作每个GET请求。

获取用户名和密码,请求令牌和验证令牌都是身份验证。听起来像你接下来要做的就是授权,它涵盖了用户可以做什么"。

为了授权请求,您需要一种机制来识别每个用户/用户组可以做什么和不能做什么,并在单个GET端点查询,以确定是否应该允许用户发出请求如果没有返回适当的403 Forbidden响应。

答案 2 :(得分:0)

在ASP.NET中,您可以通过启用CORS功能来阻止此类请求。 首先,您需要安装" Microsoft.AspNet.WebApi.Cors"包,使用Nuget Manager。然后按照以下修改WebApiConfig文件。

public static class WebApiConfig  
{  
    public static void Register(HttpConfiguration config)  
    {  
        var cors = new EnableCorsAttribute("http://localhost:18479", "*", "*");  
        config.EnableCors(cors);  
        // Web API configuration and services  

        // Web API routes  
        config.MapHttpAttributeRoutes();  
        config.Routes.MapHttpRoute(name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new {  
        id = RouteParameter.Optional });  
    }  
}  

您可以为每个控制器启用每个操作的cors。以上示例将使全球范围内的角色成为可能