如何使用webapi 2将数据从AuthorizeAttribute传递到控制器?

3

我创建了一个自定义的 AuthorizeAttribute,用于验证用户的一些 OAuth凭证

一旦我获得了有效的用户,我想在web api .net中将响应数据返回给控制器,我该如何实现这一点。

public class CustomAttribute : AuthorizeAttribute
{
    protected override bool IsAuthorized(HttpActionContext actionContext)
    {
        var response = mydata.Result.Content.ReadAsStringAsync();
        if (mydata.Result.StatusCode == HttpStatusCode.OK)
        {
            // return response data to controller
            return true;
        }
    }
}

我搜索了一下,发现在MVC中可以像下面这样做:

我搜索到in mvc,可以像下面这样做。

public class CustomAttribute : AuthorizeAttribute
{
   public string BlackListedUsers { get; set; }
   protected override bool AuthorizeCore(AuthorizationContext filterContext)
   {
     filterContext.HttpContext.Items["test"] = "foo";
     return true;
   }
}

在控制器中 -

_yourVariable = HttpContext.Items["test"];

web api中,我该如何使用System.Web.Http实现这个功能,因为在webapi中我没有方法AuthorizeCore和输入参数AuthorizationContext


通过容器和依赖属性,例如。 - undefined
在WebAPI中,我没有AuthorizeCore方法和输入参数AuthorizationContext。 - undefined
4个回答

5
这种方法是可行的,但不建议使用。
在你的IsAuthorized函数内部 -
protected override bool IsAuthorized(HttpActionContext actionContext)
{
    var response = mydata.Result.Content.ReadAsStringAsync();
    if (mydata.Result.StatusCode == HttpStatusCode.OK)
    {
        string someValue = "any value";
        actionContext.Request.Properties.Add(new KeyValuePair<string, object>("YourKeyName", someValue));
        return true;
    }
}
someValue 可以是字符串、整数或任何你想要的自定义对象。
在控制器中,你可以这样获取它 -
object someObject;
Request.Properties.TryGetValue("YourKeyName", out someObject);

actionContext.Request.Properties是每个用户独立的吗?我的意思是,如果两个用户同时将其设置为不同的值,会发生什么? - undefined
是的,请求属性是特定于用户的。 - undefined

4
在Web API 2.0中,HttpActionContext.Request.Properties等价于AuthorizationContext.HttpContext.Items。因此,您可以向属性添加一个项目,并通过Request.Properties["keyName"]在控制器中获取它。
public class CustomAttribute : AuthorizeAttribute
{
    protected override bool IsAuthorized(HttpActionContext actionContext)
    {
        var response = mydata.Result.Content.ReadAsStringAsync();
        if (mydata.Result.StatusCode == HttpStatusCode.OK)
        {
            actionContext.Request.Properties["keyName"] = keyValue;
            return true;
        }
    }
}

1
如果你有一个名为MyController的控制器,并在该控制器上定义了属性MyProperty,那么在授权中你可能会有类似以下的代码:
(filterContext.Controller as MyController).MyProperty= "any value";

在您的控制器中,您只需要正常地访问MyProperty。

0

我用这样的代码

 protected override bool AuthorizeCore(System.Web.Http.Controllers.HttpActionContext actionContext)
        {
            BaseApiController Controller = actionContext.ControllerContext.Controller as BaseApiController;
            baseApi.Property = 10;
            return Controller.IsAuthorize();
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接