2

我有一个使用旧 API 的网络服务。几乎我所有的服务处理程序都需要身份验证,因此我在服务级别上使用了 Authenticate 属性。

我所有的服务都实现了一个自定义的基础服务,它使用 OnBeforeExecute 来填充一些与身份验证相关的属性。

有没有一种快速的方法来查看当前请求的处理程序是否需要在 OnBeforeExecute 方法中进行身份验证?

我宁愿不必使用反射来查看属性,因为我知道这是一个相当缓慢的操作。我还希望 ServiceStack 系统已经在其腹部某处拥有此信息 :)


我最终做了什么

由于我的项目有服务,我使用 Authenticate 的 ApplyTo 参数来禁用某些处理程序的身份验证要求,我最终得到以下结果。

protected override void OnBeforeExecute(TRequestDto request)
{
    base.OnBeforeExecute(request);

    var attr = FilterAttributeCache.GetRequestFilterAttributes(request.GetType()).OfType<AuthenticateAttribute>().FirstOrDefault();
    if (attr != null)
    {
        ApplyTo reqmethod = base.Request.HttpMethodAsApplyTo();
        if ((attr.ApplyTo & reqmethod) == reqmethod)
        {
            //
            // do stuff that should only be done when 
            // the handler requires authentication
            //
        }
    }
}
4

1 回答 1

2

Authentication请求过滤器属性没有什么特别之处,只是它的优先级最低,所以它首先被执行。

ServiceStack 确实维护了一个请求 DTO 具有的所有属性的FilterAttributeCache,因此您可以使用此 API 来确定是否为特定服务定义了 AuthenticateAttribute,例如:

var hasAuth = FilterAttributeCache.GetRequestFilterAttributes(request.GetType())
   .OfType<AuthenticateAttribute>().FirstOrDefault() != null;
于 2013-03-06T13:33:00.260 回答