【发布时间】:2013-05-29 05:08:41
【问题描述】:
我正在使用 Web API 并设置了一个简单的身份验证和授权机制,调用者在其中传递了我在查询字符串中颁发给他们的令牌。所以他们提交了如下请求:
https://mysite.com/api/Ping?token=[issued-token]
我有一个像这样的 ApiAuthorizeAttribute:
public class ApiAuthorizeAttribute : System.Web.Http.AuthorizeAttribute
{
public ApiPermission Permission { get; set; }
public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext)
{
switch (Permission)
{
case ApiPermission.None:
return;
case ApiPermission.Write:
case ApiPermission.Read:
string query = actionContext.Request.RequestUri.Query;
var nvc = System.Web.HttpUtility.ParseQueryString(query);
string token = nvc["token"];
// (my code to map the token to an Authorization for the request)
ApiAuthorization auth = ApiToken.GetAuthorization(token);
if (auth != null && auth.HasPermission(Permission))
return;
HandleUnauthorizedRequest(actionContext);
return;
default:
throw new ArgumentException("Unexpected Permission");
}
}
}
然后我可以像这样装饰我的 API。注意:这只是一个例子,真正的调用会从他们的账户中读取数据(账户标识符在他们的令牌中加密)并返回。
/// <summary>
/// Ping service that requires a Token with Read permission
/// Returns "Success!"
/// </summary>
[ApiAuthorize(Permission = ApiPermission.Read)]
[HttpGet]
public string Ping()
{
return "Success!";
}
正如您可能注意到的,我无法从 HttpActionContext 参数的任何地方访问 QueryString,必须自己构建它。他们似乎从这个 Request 对象中明确删除了 QueryString 。我不想将“标记”添加到每个 API 方法中,以便在 Route Data 中获取它。
所以我的问题是:
- QueryString 是否在某处而我只是想念它?如果没有,知道为什么微软不将它包含在这个 Request 对象中吗? (即,也许这是一件坏事?)
- 是否有更好的方法来处理在 AuthorizeAttribute 中获取令牌(同样,无需将其添加到每个调用中)?
顺便说一句,我意识到还有其他(可能更好的)授权选项,例如基本身份验证和 OAuth,我不想在这里讨论这个话题。
【问题讨论】:
-
你试过
actionContext.Request.QueryString。 stackoverflow.com/questions/2219647/… -
@Satpal,是的,当我开始编写代码时,我曾假设该属性会存在。但是那个特定的 Request 对象没有那个属性。这是我问题的症结所在 - 为什么不呢?
-
actionContext.Request.RequestUri.Query也可能有用。 http://stackoverflow.com/questions/12817202/accessing-post-or-get...
标签: c# asp.net-mvc asp.net-web-api