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



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

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

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

1(

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

2(

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

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

如果您想在使用[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 { ... }

相关内容

  • 没有找到相关文章

最新更新