ServiceStack:使用HTTP请求中的标头验证每个请求

时间:2018-09-17 13:09:33

标签: web-services authentication servicestack

我已经读过other posts的同一主题,但是我并没有真正清楚地知道如何最好地解决这个问题:

我有一个Web服务,当涉及到身份验证/会话时它是“无状态的”,这意味着客户端将在每个请求(在HTTP标头中)中发送两个字符串AuthToken和{{1} }。

然后将这两个字符串与存储进行比较,如果找到,我们知道它是哪个用户。

1)

Id喜欢为我要保护的每个服务使用DeviceUUID属性,然后应该在检查两个字符串的地方执行一个方法。

2)

如果我添加[Authenticate],还应该执行一个方法,在该方法中我可以访问HTTP标头(两个字符串),因此可以进行查找。

我不确定如何以最简单,最干净的方式执行此操作。我不想创建ServiceStack Session对象等,我只想为每个装饰的服务运行一种方法来检查已验证状态的方法。

Thx =)

1 个答案:

答案 0 :(得分:2)

如果您在使用[Authenticate][RequiredRole]属性时还想执行其他操作 ,那么听起来好像您想要自定义[MyAuthenticate] {{ 3}}两者都执行,即验证请求是否已通过身份验证并执行您的自定义功能,例如:

public class MyAuthenticateAttribute : AuthenticateAttribute
{
    public override async Task ExecuteAsync(IRequest req, IResponse res, object dto)
    {
        await base.ExecuteAsync(req, res, requestDto);

        var authenticated = !res.IsClosed; 
        if (authenticated)
        {
            //...
        }
    }
}

然后在需要额外功能的地方使用它代替[Authenticate]

[MyAuthenticate]
public class MyServices { ... }

但是我个人将逻辑放在单独的属性中

public class MyLogicPostAuthAttribute : RequestFilterAsyncAttribute 
{
    public override async Task ExecuteAsync(IRequest req, IResponse res, object dto)
    {
        //...
    }
}

因此它们是明确的,可以独立于[Authenticate]属性进行分层,例如:

[Authenticate]
[MyLogicPostAuth]
public class MyServices { ... }

也可以像这样组合:

[Authenticate, MyLogicPostAuth]
public class MyServices { ... }