DotNetOpenAuth OAuth2访问额外数据

时间:2014-12-24 16:08:48

标签: c# .net oauth-2.0 dotnetopenauth

我使用DotNetOpenAuth的OAuth2库来处理与其他第三方系统的授权。这一切都很有效,除了第三方系统返回UserId =" testname"在使用AccessToken的响应中。

我需要UserId,因为此第三方API要求将其作为API调用的一部分(例如:users / {userId} / account)。

使用DotNetOpenAuth,我无法访问AccessToken响应,因此无法获取UserId。

我打电话:( _client是一个WebServerClient) var state = _client.ProcessUserAuthorization(request);

state有我的AccessToken,但没有发送的额外数据。基于DotNetOpenAuth源代码,UserId进入了库内,我无法访问。

无论如何使用DotNetOpenAuth获取UserId?或者我是否需要放弃DotNetOpenAuth并尝试其他方法?

2 个答案:

答案 0 :(得分:1)

您可以通过实施IDirectWebRequestHandler并将其分配给Channel来访问请求和响应数据。但是对于当前实现的DNOA,我使用它的唯一方法是将代理模式应用于现有的UntrustedWebRequestHandler类,这是因为这个特定的处理程序传递了一个CachedDirectWebResponse,它有一个响应流,可以多次读取 - 一次通过代码检索其他数据,然后通过下游代码读取ProcessUserAuthorization()

这是自定义IDirectWebRequestHandler的代码:

public class RequestHandlerWithLastResponse : IDirectWebRequestHandler
    {
    private readonly UntrustedWebRequestHandler _webRequestHandler;
    public string LastResponseContent { get; private set; }

    public RequestHandlerWithLastResponse(UntrustedWebRequestHandler webRequestHandler)
        {
        if (webRequestHandler == null) throw new ArgumentNullException( "webRequestHandler" );
        _webRequestHandler = webRequestHandler;
        }

    public bool CanSupport( DirectWebRequestOptions options )
        {
        return _webRequestHandler.CanSupport( options );
        }

    public Stream GetRequestStream( HttpWebRequest request )
        {
        return _webRequestHandler.GetRequestStream( request, DirectWebRequestOptions.None );
        }

    public Stream GetRequestStream( HttpWebRequest request, DirectWebRequestOptions options )
        {
        return _webRequestHandler.GetRequestStream( request, options );
        }

    public IncomingWebResponse GetResponse( HttpWebRequest request )
        {
        var response = _webRequestHandler.GetResponse( request, DirectWebRequestOptions.None );

        //here we actually getting the response content
        this.LastResponseContent = GetResponseContent( response );

        return response;
        }

    public IncomingWebResponse GetResponse( HttpWebRequest request, DirectWebRequestOptions options )
        {
        return _webRequestHandler.GetResponse( request, options );
        }

    private string GetResponseContent(IncomingWebResponse response)
        {

        MemoryStream stream = new MemoryStream();
        response.ResponseStream.CopyTo(stream);

        stream.Position = 0;
        response.ResponseStream.Position = 0;

        using (var sr = new StreamReader(stream))
            {
            return sr.ReadToEnd();
            }
        }
    }

这就是我们应用它并获取响应数据的方式:

var h = new RequestHandlerWithLastResponse(new UntrustedWebRequestHandler()); ;
_client.Channel.WebRequestHandler = h;

var auth = _client.ProcessUserAuthorization( request );

//convert response json to POCO
var extraData = JsonConvert.DeserializeObject<MyExtraData>( h.LastResponseContent );

答案 1 :(得分:0)

直接从请求中读取id,在调用ProcessUserAuthorization之后行,取决于它的传递方式(正文,查询字符串)。我认为没有理由停止使用DNOA。

var auth = client.ProcessUserAuthorization();
if ( auth != null )
{
   // this is where you could still access the identity provider's request
   ...

请注意,将其他参数与访问令牌一起传递相当罕见,可能会导致潜在的安全问题。这是因为身份提供者的响应首先进入用户的浏览器,然后提交给您的服务器。用户可能通过保留访问令牌但用任何其他有效用户ID替换userid来改变身份提供者的响应。