尝试使用Windows Forms代码在Google Apps域中创建用户 [英] Trying to Creating users in Google Apps domain in Windows Forms code
问题描述
我正在尝试从Windows窗体应用程序创建用户.
I'm trying to create a user from a windows forms application.
我已经设法在consoleapp中做到了,但是我想要在适当的Windows app中做到这一点. :)
I've managed to do it in a consoleapp, but I want it in a proper windows app. :)
要获得正确的身份验证,'我试图弄清楚AssertionFlowClient的工作方式,但不会正确进行.
To get the authentication right' I've tried to figure out how the AssertionFlowClient is working, but it won't come out right.
这是关键代码:
private void CreateUserBtn_Click(object sender, EventArgs e)
{
var provider = new AssertionFlowClient(GoogleAuthenticationServer.Description, new X509Certificate2(@"C:\key.p12", "notasecret", X509KeyStorageFlags.Exportable))
{
ServiceAccountId = "somemail@developer.gserviceaccount.com",
Scope = DirectoryService.Scopes.AdminDirectoryUser.GetStringValue(),
ServiceAccountUser = "myadress@mydomain.mygbiz.com",
};
var auth = new OAuth2Authenticator<AssertionFlowClient>(provider, AssertionFlowClient.GetState);
DirectoryService m_serviceUser = new DirectoryService(new BaseClientService.Initializer()
{
Authenticator = auth,
});
User newuserbody = new User();
UserName newusername = new UserName();
newuserbody.PrimaryEmail = UserNameTextBox.Text + "@" + DomainTextBox.Text;
newusername.GivenName = GivenNameTextBox.Text;
newusername.FamilyName = FamilyNameTextBox.Text;
newuserbody.Name = newusername;
newuserbody.Password = PasswordTextBox.Text;
m_serviceUser.Users.Insert(newuserbody).Execute();
}
这是错误消息:
在Google.Apis.dll中发生了类型为'DotNetOpenAuth.Messaging.ProtocolException'的未处理异常
An unhandled exception of type 'DotNetOpenAuth.Messaging.ProtocolException' occurred in Google.Apis.dll
其他信息:发送直接消息或获取响应时发生错误.
Additional information: Error occurred while sending a direct message or getting the response.
再次添加了som Debug输出:
Edit : added som Debug output again:
CreateUserWinForm.vshost.exe Information: 0 : DotNetOpenAuth, Version=4.0.0.11165, Culture=neutral, PublicKeyToken=2780ccd10d57b246 (official)
CreateUserWinForm.vshost.exe Information: 0 : Preparing to send AssertionFlowMessage (2.0) message.
CreateUserWinForm.vshost.exe Information: 0 : Sending AssertionFlowMessage request.
CreateUserWinForm.vshost.exe Information: 0 : HTTP POST https://accounts.google.com/o/oauth2/token
'CreateUserWinForm.vshost.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.resources\v4.0_4.0.0.0_sv_b77a5c561934e089\System.resources.dll'
A first chance exception of type 'DotNetOpenAuth.Messaging.ProtocolException' occurred in DotNetOpenAuth.dll
Additional information: Error occurred while sending a direct message or getting the response.
A first chance exception of type 'DotNetOpenAuth.Messaging.ProtocolException' occurred in Microsoft.Threading.Tasks.dll
Additional information: Error occurred while sending a direct message or getting the response.
A first chance exception of type 'System.AggregateException' occurred in mscorlib.dll
A first chance exception of type 'DotNetOpenAuth.Messaging.ProtocolException' occurred in Google.Apis.dll
Additional information: Error occurred while sending a direct message or getting the response.
An unhandled exception of type 'DotNetOpenAuth.Messaging.ProtocolException' occurred in Google.Apis.dll
Additional information: Error occurred while sending a direct message or getting the response.
The program '[7820] CreateUserWinForm.vshost.exe: Managed (v4.0.30319)' has exited with code 0 (0x0).
推荐答案
我设法通过主要来自google-api-samples/Tasks.WinForms.NoteMgr的modyfin代码解决了这一问题;这是我的操作方式:
I managed to solve this, primarily by modyfin code from the google-api-samples/Tasks.WinForms.NoteMgr; Here's how I've done it:
public static DirectoryService Service { get; private set; }
private static IAuthenticator CreateAuthenticator()
{
var provider = new NativeApplicationClient(GoogleAuthenticationServer.Description);
provider.ClientIdentifier = <myClientId>;
provider.ClientSecret = <myClientSecret>";
return new OAuth2Authenticator<NativeApplicationClient>(provider, GetAuthentication);
}
private static IAuthorizationState GetAuthentication(NativeApplicationClient client)
{
// You should use a more secure way of storing the key here as
// .NET applications can be disassembled using a reflection tool.
const string STORAGE = "bergstedts.directoryservice";
const string KEY = "y},drdzf11x9;87";
string scope = DirectoryService.Scopes.AdminDirectoryUser.GetStringValue();
// Check if there is a cached refresh token available.
IAuthorizationState state = AuthorizationMgr.GetCachedRefreshToken(STORAGE, KEY);
if (state != null)
{
try
{
client.RefreshToken(state);
return state; // Yes - we are done.
}
catch (DotNetOpenAuth.Messaging.ProtocolException ex)
{
CommandLine.WriteError("Using existing refresh token failed: " + ex.Message);
}
}
// Retrieve the authorization from the user.
state = AuthorizationMgr.RequestNativeAuthorization(client, scope);
AuthorizationMgr.SetCachedRefreshToken(STORAGE, KEY, state);
return state;
}
private void CreateUserBtn_Click(object sender, EventArgs e)
{
// Create Service
DirectoryService m_serviceUser = new DirectoryService(new BaseClientService.Initializer()
{
Authenticator = CreateAuthenticator(),
ApplicationName = "newuser"
});
// Store data from TextBoxes in form to User-object
User newuserbody = new User();
newuserbody.Name = new UserName();
newuserbody.PrimaryEmail = UserNameTextBox.Text + "@" + DomainTextBox.Text;
newuserbody.Name.GivenName = GivenNameTextBox.Text;
newuserbody.Name.FamilyName = FamilyNameTextBox.Text;
newuserbody.Password = PasswordTextBox.Text;
// Create user and store the newly created user in ccreateduser
User createduser = m_serviceUser.Users.Insert(newuserbody).Execute();
// display Userdata
CreatedUserLbl.Text = "User : " + createduser.PrimaryEmail + " has been created!";
// Clear inputfields (except for domain)
UserNameTextBox.Text = "";
GivenNameTextBox.Text = "";
FamilyNameTextBox.Text = "";
PasswordTextBox.Text = "";
}
这篇关于尝试使用Windows Forms代码在Google Apps域中创建用户的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!