我已经阅读了有关同一主题的其他帖子,但我还没有真正清楚地了解如何最好地解决这个问题:
我有一个网络服务,在身份验证/会话方面是"无状态的",这意味着客户端将为每个请求(在 HTTP 标头中(、AuthToken
和DeviceUUID
发送两个字符串。
然后将这两个字符串与存储进行比较,如果找到,我们知道它是哪个用户。
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 { ... }