我正在使用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,只能自己构建它。似乎他们明确从此请求对象中删除了QueryString。我不想在每个API方法中都添加“token”以便将其放入路由数据中。
那么我的问题是:
- QueryString是否存在于某处且我只是错过了它?如果没有,有任何想法为什么Microsoft不会将其与此请求对象一起包含? (例如,可能这是一件坏事?)
- 是否有更好的方法处理在AuthorizeAttribute中获取令牌(再次不添加到每个调用中)?
顺便说一下,我意识到还有其他(可能更好的)授权选项,例如基本身份验证和OAuth,我不想在这里讨论这个主题。
actionContext.Request.QueryString
吗?https://dev59.com/GnE95IYBdhLWcg3wp_kg - SatpalactionContext.Request.RequestUri.Query
也可能很有用。https://dev59.com/B2cs5IYBdhLWcg3wfD9P... - Kristopher