我正在使用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方法中,以便在路径数据中获取它。
所以我的问题是:
答案 0 :(得分:31)
虽然Adam Tal的答案完全有效,但在Web API新世界秩序中,您真的不想使用System.Web
命名空间中的任何内容;实际上你甚至不想引用它。唉,您可以从GetQueryNameValuePairs()扩展方法获取查询字符串。这样可以让你轻松地切断System.Web船锚,并且仍然能够满足您的需求。
using System.Net.Http;
var queryString = actionContext.Request
.GetQueryNameValuePairs()
.ToDictionary(x => x.Key, x => x.Value);
答案 1 :(得分:11)
尝试
using System.Web;
HttpContext.Current.Request.QueryString
答案 2 :(得分:0)
NameValueCollection queryString = actionContext.Request.RequestUri.ParseQueryString();
对我有用。