我有一个Web API服务,它使用请求标头传入ApiKey。从ActionFilterAttribute派生的自定义操作筛选器(AuthenticationRequiredAttribute)会覆盖OnActionExecuting方法并执行DB调用以获取与有效ApiKey关联的ClientId。我可以通过HttpActionContext.Request.Properties.Add ("clientID", clientID)
将ClientID分配为属性,但是我无法在控制器操作方法中访问关联的actionContext对象,因此它没有任何价值。
当然这是一种常见的情况,但我找不到处理它的好例子。如何将HttpActionContext实例导入控制器类?
以下是过滤器:
public override void OnActionExecuting(HttpActionContext actionContext)
在此范围内,我获得了ClientID,但我不知道如何将其传递给下面的方法:
这是Controller的方法:
[Route("v1/stock/{SecurityId}/text")]
public HttpResponseMessage GetSummaryTextV1(string SecurityId, string topic = "")
HttpActionContext不可用。我在这里需要ClientID,但无法得到它。
有没有办法可以将当前的actionContext传递给Controller构造函数?
亏本,现在硬连接clientId,所以我可以继续。
答案 0 :(得分:0)
请参阅:http://stevescodingblog.co.uk/basic-authentication-with-asp-net-webapi/
我实施了这种方法。对呼叫者进行身份验证后,我将其客户端ID存储在自定义IIdentity
中,然后在控制器中使用。
答案 1 :(得分:0)
使用Request.Properties
访问属性。
编辑:
您可以像在问题中一样在属性中设置CliendID
HttpActionContext.Request.Properties.Add ("clientID", clientID)
并使用Request.Properties
答案 2 :(得分:0)
我找到了解决这个问题的简单方法。而不是使用从ActionFilterAttribute类派生并在global.asax中指定的自定义“AuthenticationRequired”属性:
GlobalConfiguration.Configuration.Filters.Add(new AuthenticationRequiredAttribute());
public class AuthenticationRequiredAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
/* My authentication and lookup logic here */
}
}
我只是将逻辑放在一个新的Controller构造函数中,其中的字段的值在成功验证时填充。它简单直接。没有HttpActionContext.Request.Properties.Add gobbledygook,没有复活会话对象,只是字段和构造函数。咄。话虽如此,我很欣赏我收到的两条建议;我只是无法实现它们。