我使用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并尝试其他方法?
答案 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来改变身份提供者的响应。