ServiceStack令牌认证

时间:2014-04-01 16:51:32

标签: c# web-services authentication servicestack

首先了解一下我申请的一些信息。我必须通过webservices公开数据访问,并且我选择了ServiceStack来实现这一点。由于我不想拥有有状态的Web服务,因此我选择使用Jwt令牌来处理用户授权。客户端从服务调用中验证并获取令牌,然后将toekn放入Authorization标头中,并且每个请求都会验证它。

在我的服务中,执行呼叫的授权不仅仅是检查用户是否登录,而是从请求的reuqest变化,例如:

  1. 检查权限A
  2. 检查对象O1上的权限A
  3. 检查对象O2上的权限B
  4. 其中一些检查可以使用服务中强制执行的请求过滤器,因为它们取决于请求中传递的数据。

    我关心的是除了从数据库中提取用户权限所需的行程之外,还在授权的所有级别中从标头中验证令牌和提取值。所以我想找到一种方法来根据每个请求管理一个令牌。

    我想出的是一个TokenAuthorizaionManager,它能够从请求中提取和修改令牌。我在具有请求范围的容器中注册此类

    container.RegisterAutoWired<TokenAuthorizationManager>().ReusedWithin(ReuseScope.Request);
    

    然后我有一个PreRequest过滤器从容器中获取令牌授权管理器并从头文件中加载数据令牌

    PreRequestFilters.Add((req, res) =>
            {
                var tokenManager = req.TryResolve<TokenAuthorizationManager>();
                if (tokenManager != null)
                    tokenManager.ExtractTokenInfo(req);
            });
    

    此时,在任何授权/身份验证步骤中,我都使用相同的TokenAuthorizationManager来验证权限和角色。

    这是我可以处理这样的事情的最佳方式,还是在使用无会话服务的服务堆栈中有更好的代币身份验证替代方案?

    其他信息:

    1. 我有不同类型的用户需要的不仅仅是用户名/密码才能进行成功的身份验证,因此我不想使用servicestack身份验证功能。
    2. 我的网络客户端将是一个angularjs应用程序(如果我设法将所有内容粘在一起)
    3. 感谢您对这些主题的任何启发。

1 个答案:

答案 0 :(得分:0)

我没有看到您可以做出任何改进,事实上,在我看来,您正确使用预请求过滤器。

我还实现了一个身份验证提供程序,ServiceStack在预请求过滤器上读取输入数据,就像您执行此操作一样。我们的客户也是使用Angular开发的,我们为http客户设置了授权标头的拦截器(我们使用Restangular更具体)。

预请求过滤器允许您授予非授权用户未达到服务的权限。对于您可能希望根据其他权限标准授权每个服务的更复杂的授权模式,我通常使用请求属性。

如果我是你,我会检查ServiceStack正在实施的授权的源代码并尝试从那里开始。