1

我正在使用用于 MVC 的 OAuth 2.0,一个用于 Oauth2 的 .NET 库。但是,我正在构建一个 Web Api 项目,并希望让这个库与 Web Api 一起使用。

我遇到的问题是该库在从控制器调用的 HttpRequestBase 上使用了两个扩展方法。

以下是扩展方法:

public static string GetToken(this HttpRequest request)
    {
        var wrapper = new HttpRequestWrapper(request);
        return GetToken(wrapper);
    }

    public static string GetToken(this HttpRequestBase request)
    {
        if (request == null)
            return String.Empty;

        // Find Header
        var headerText = request.Headers[OAuthConstants.AuthorzationHeader];
        if (!String.IsNullOrEmpty(headerText))
        {
            var header = new AuthorizationHeader(headerText);
            if (string.Equals(header.Scheme, "OAuth", StringComparison.OrdinalIgnoreCase))
                return header.ParameterText.Trim();
        }

        // Find Clean Param
        var token = request.Params[OAuthConstants.AuthorzationParam];
        return !String.IsNullOrEmpty(token)
            ? token.Trim()
            : String.Empty;
    }

在 MVC 项目中,他们只需从控制器调用 Request.GetToken()。当然,Web Api 的请求是一个 HttpRequestMessage。恐怕现在解决 HttpRequest 和 HttpRequest 消息之间的区别超出了我的能力范围。

我可以将此扩展方法转换为与 HttpRequestMessage 一起使用或以某种方式使其在 Web Api 中工作吗?

谢谢!

4

1 回答 1

1

您以前拥有的所有属性仍然可用(假设 OAuthConstants.AuthorzationParam 已在查询字符串上设置?)

using System;
using System.Linq;
using System.Net.Http;

namespace YourApp
{
    public static class Extensions
    {
        public static string GetToken(this HttpRequestMessage request)
        {
           if (request == null)
               return String.Empty;

           // Find Header
           var headerText = request.Headers.GetValues(OAuthConstants.AuthorzationHeader).SingleOrDefault();
           if (!String.IsNullOrEmpty(headerText))
           {
               //Brevity...
           }

           // Find Clean Param
           var token = request.GetQueryNameValuePairs().SingleOrDefault(x => x.Key == OAuthConstants.AuthorzationParam).Value;
           return !String.IsNullOrEmpty(token)
               ? token.Trim()
               : String.Empty;
       }
   }

}

控制器

using System.Collections.Generic;
using System.Web.Http;
using YourApp;

namespace YourApp.Controllers
{
    public class FoosController : ApiController
    {
        public IEnumerable<string> Get()
        {
            var token = Request.GetToken();

            return null;
        }
    }
}
于 2012-10-25T08:41:25.080 回答