Issue with translating a delegate function from c# to vb.net for use with Google OAuth 2
- by Jeremy
I've been trying to translate a Google OAuth 2 example from C# to Vb.net for a co-worker's project.
I'm having on end of issues translating the following methods:
private OAuth2Authenticator<WebServerClient> CreateAuthenticator()
{
// Register the authenticator.
var provider = new WebServerClient(GoogleAuthenticationServer.Description);
provider.ClientIdentifier = ClientCredentials.ClientID;
provider.ClientSecret = ClientCredentials.ClientSecret;
var authenticator =
new OAuth2Authenticator<WebServerClient>(provider, GetAuthorization) { NoCaching = true };
return authenticator;
}
private IAuthorizationState GetAuthorization(WebServerClient client)
{
// If this user is already authenticated, then just return the auth state.
IAuthorizationState state = AuthState;
if (state != null)
{
return state;
}
// Check if an authorization request already is in progress.
state = client.ProcessUserAuthorization(new HttpRequestInfo(HttpContext.Current.Request));
if (state != null && (!string.IsNullOrEmpty(state.AccessToken) || !string.IsNullOrEmpty(state.RefreshToken)))
{
// Store and return the credentials.
HttpContext.Current.Session["AUTH_STATE"] = _state = state;
return state;
}
// Otherwise do a new authorization request.
string scope = TasksService.Scopes.TasksReadonly.GetStringValue();
OutgoingWebResponse response = client.PrepareRequestUserAuthorization(new[] { scope });
response.Send(); // Will throw a ThreadAbortException to prevent sending another response.
return null;
}
The main issue being this line:
var authenticator = new OAuth2Authenticator<WebServerClient>(provider, GetAuthorization) { NoCaching = true };
The Method signature reads as for this particular line reads as follows:
Public Sub New(tokenProvider As TClient, authProvider As System.Func(Of TClient, DotNetOpenAuth.OAuth2.IAuthorizationState))
My understanding of Delegate functions in VB.net isn't the greatest. However I have read over all of the MSDN documentation and other relevant resources on the web, but I'm still stuck as to how to translate this particular line.
So far all of my attempts have resulted in either the a cast error (see below) or no call to GetAuthorization.
The Code (vb.net on .net 3.5)
Private Function CreateAuthenticator() As OAuth2Authenticator(Of WebServerClient)
' Register the authenticator.
Dim client As New WebServerClient(GoogleAuthenticationServer.Description, oauth.ClientID, oauth.ClientSecret)
Dim authDelegate As Func(Of WebServerClient, IAuthorizationState) = AddressOf GetAuthorization
Dim authenticator = New OAuth2Authenticator(Of WebServerClient)(client, authDelegate) With {.NoCaching = True}
'Dim authenticator = New OAuth2Authenticator(Of WebServerClient)(client, GetAuthorization(client)) With {.NoCaching = True}
'Dim authenticator = New OAuth2Authenticator(Of WebServerClient)(client, New Func(Of WebServerClient, IAuthorizationState)(Function(c) GetAuthorization(c))) With {.NoCaching = True}
'Dim authenticator = New OAuth2Authenticator(Of WebServerClient)(client, New Func(Of WebServerClient, IAuthorizationState)(AddressOf GetAuthorization)) With {.NoCaching = True}
Return authenticator
End Function
Private Function GetAuthorization(arg As WebServerClient) As IAuthorizationState
' If this user is already authenticated, then just return the auth state.
Dim state As IAuthorizationState = AuthState
If (Not state Is Nothing) Then
Return state
End If
' Check if an authorization request already is in progress.
state = arg.ProcessUserAuthorization(New HttpRequestInfo(HttpContext.Current.Request))
If (state IsNot Nothing) Then
If ((String.IsNullOrEmpty(state.AccessToken) = False Or String.IsNullOrEmpty(state.RefreshToken) = False)) Then
' Store Credentials
HttpContext.Current.Session("AUTH_STATE") = state
_state = state
Return state
End If
End If
' Otherwise do a new authorization request.
Dim scope As String = AnalyticsService.Scopes.AnalyticsReadonly.GetStringValue()
Dim _response As OutgoingWebResponse = arg.PrepareRequestUserAuthorization(New String() {scope})
' Add Offline Access and forced Approval
_response.Headers("location") += "&access_type=offline&approval_prompt=force"
_response.Send() ' Will throw a ThreadAbortException to prevent sending another response.
Return Nothing
End Function
The Cast Error
Server Error in '/' Application.
Unable to cast object of type 'DotNetOpenAuth.OAuth2.AuthorizationState' to type 'System.Func`2[DotNetOpenAuth.OAuth2.WebServerClient,DotNetOpenAuth.OAuth2.IAuthorizationState]'.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.InvalidCastException: Unable to cast object of type 'DotNetOpenAuth.OAuth2.AuthorizationState' to type 'System.Func`2[DotNetOpenAuth.OAuth2.WebServerClient,DotNetOpenAuth.OAuth2.IAuthorizationState]'.
I've spent the better part of a day on this, and it's starting to drive me nuts.
Help is much appreciated.