ServiceStack:如何查看当前请求的处理程序是否需要身份验证

时间:2013-03-06 13:07:12

标签: authentication servicestack

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

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

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

我宁愿不必使用反射查看属性,因为我理解这是一个相当慢的操作。我还期望ServiceStack系统已在其腹部的某处获得此信息:)


我最终做了什么

由于我的项目有服务,我使用Authenticate的ApplyTo参数来禁用某些处理程序的auth要求,我最终得到了以下内容。

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
            //
        }
    }
}

1 个答案:

答案 0 :(得分:2)

Authentication请求过滤器属性没有什么特别之处,除了它有lowest priority所以它首先被执行。

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

var hasAuth = FilterAttributeCache.GetRequestFilterAttributes(request.GetType())
   .OfType<AuthenticateAttribute>().FirstOrDefault() != null;