ServiceStack:使用HTTP请求中的标头对每个请求进行身份验证

web-services authentication servicestack

23 观看

1回复

9043 作者的声誉

我已经阅读了同一主题的其他帖子,但我还没有真正清楚地了解如何最好地解决这个问题:

我有一个web服务,在身份验证/会话方面是“无状态的”,这意味着客户端将为每个请求发送两个字符串(在HTTP标头中),AuthTokenDeviceUUID

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

1)

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

2)

如果我添加[RequiredRole],也应该执行一个方法,我可以访问HTTP头(两个字符串),所以我可以进行查找。

我不确定如何以最简单和最干净的方式做到这一点。我不想创建ServiceStack Session对象等,我只想要一个方法,对于每个修饰的服务,运行一个方法来检查已验证的状态。

Thx =)

作者: Ted 的来源 发布者: 2018 年 9 月 17 日

回应 1


2

121873 作者的声誉

决定

如果你想在使用和属性时另外执行其他操作那么听起来你想要一个自定义请求过滤器属性同时执行这两个操作,即验证请求是否经过身份验证并执行自定义功能,例如:[Authenticate][RequiredRole][MyAuthenticate]

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 { ... }
作者: mythz 发布者: 2018 年 9 月 17 日
32x32