我已经读过other posts的同一主题,但是我并没有真正清楚地知道如何最好地解决这个问题:
我有一个Web服务,当涉及到身份验证/会话时它是“无状态的”,这意味着客户端将在每个请求(在HTTP标头中)中发送两个字符串AuthToken
和{{1} }。
然后将这两个字符串与存储进行比较,如果找到,我们知道它是哪个用户。
Id喜欢为我要保护的每个服务使用DeviceUUID
属性,然后应该在检查两个字符串的地方执行一个方法。
如果我添加[Authenticate]
,还应该执行一个方法,在该方法中我可以访问HTTP标头(两个字符串),因此可以进行查找。
我不确定如何以最简单,最干净的方式执行此操作。我不想创建ServiceStack Session对象等,我只想为每个装饰的服务运行一种方法来检查已验证状态的方法。
Thx =)
答案 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 { ... }