尝试调用Scheduler API方法但无法使用Azure Mobile Service Job。在本地工作

时间:2015-09-16 15:24:18

标签: c# security azure azure-mobile-services x509certificate2

我有一个控制台应用程序,可以在Azure Scheduler中删除和创建作业集合中的作业。我创建了一个本地证书来创建SchedulerClient,并通过Azure门户部署了此证书 - >设置 - >管理证书 - >上传。

我已将上述代码放入移动服务应用程序中的预定作业中。

首先,作业失败,因为它声明无法找到证书: -

  

消息='正在尝试创建预定作业'作业名称'失败了   以下消息:'带有指纹的证书' xxxx'不可能   位于。'。',Exception = System.ArgumentException:带有的证书   Thumbprint' xxxx'无法找到。在   TechCare.Mobile.Services.JobManager.GetStoreCertificate(字符串   thumbprint)在TechCare.Mobile.Services.JobManager..ctor()at   lambda_method(Closure,Object [])at   Autofac.Core.Activators.Reflection.ConstructorParameterBinding.Instantiate()   ID = 6a06732a-1dba-4ce5-AFFE-dee1596877de,   类别=' App.Controllers.Jobs'

然后我创建了证书的Base64String版本,然后此错误正在返回

  

异常= Hyak.Common.CloudException:ForbiddenError:服务器   无法验证请求。验证证书是否   有效且与此订阅相关联。在   Microsoft.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务   任务)   Microsoft.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccess(任务   任务)   Microsoft.WindowsAzure.Scheduler.JobOperationsExtensions.List(IJobOperations   操作,JobListParameters参数)at   TechCare.Mobile.Services.JobManager.ClearJobCollection()at   techcaremobilewebservicesService.ScheduledJobs.dailyRoutines.CreateNotificationSchedule()   在   techcaremobilewebservicesService.ScheduledJobs.dailyRoutines.ExecuteAsync()   ID = 00000000-0000-0000-0000-000000000000

然后我找到了一种从Azure门户下载已发布的配置文件的方法,并从文件中提取了构成管理证书的字符串并尝试了但也失败了。

  

消息='正在尝试创建预定作业'作业名称'失败了   以下消息:'系统找不到指定的文件。 '&#39 ;,   Exception = System.Security.Cryptography.CryptographicException:The   系统找不到指定的文件。

     

在   System.Security.Cryptography.CryptographicException.ThrowCryptographicException(的Int32   hr)at   System.Security.Cryptography.X509Certificates.X509Utils._LoadCertFromBlob(字节[]   rawData,IntPtr密码,UInt32 dwFlags,布尔persistKeySet,   SafeCertContextHandle&安培; pCertCtx)at   System.Security.Cryptography.X509Certificates.X509Certificate.LoadCertificateFromBlob(字节[]   rawData,Object password,X509KeyStorageFlags keyStorageFlags)at   System.Security.Cryptography.X509Certificates.X509Certificate2..ctor(字节[]   rawData)at   TechCare.Mobile.Services.JobManager.GetStoreCertificate(字符串   thumbprint),Id = 31dd37b3-53cb-4f8b-8873-6155f25913dd,   类别=' App.Controllers.Jobs'

然后,我在其中找到了一些建议在创建证书时添加的标志

  

X509KeyStorageFlags flags = X509KeyStorageFlags.PersistKeySet |   X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.Exportable;

     

返回新的X509Certificate2(Convert.FromBase64String(certRaw),string.Empty,   标志);

然而这也失败了。

  

消息='正在尝试创建预定作业'作业名称'失败   带有以下消息:'访问被拒绝。 '&#39 ;,   Exception = System.Security.Cryptography.CryptographicException:Access   拒绝。

     

在   System.Security.Cryptography.CryptographicException.ThrowCryptographicException(的Int32   hr)at   System.Security.Cryptography.X509Certificates.X509Utils._LoadCertFromBlob(字节[]   rawData,IntPtr密码,UInt32 dwFlags,布尔persistKeySet,   SafeCertContextHandle&安培; pCertCtx)at   System.Security.Cryptography.X509Certificates.X509Certificate.LoadCertificateFromBlob(字节[]   rawData,Object password,X509KeyStorageFlags keyStorageFlags)at   System.Security.Cryptography.X509Certificates.X509Certificate2..ctor(字节[]   rawData,String password,X509KeyStorageFlags keyStorageFlags)at   TechCare.Mobile.Services.JobManager.GetStoreCertificate(字符串   thumbprint),Id = 07a6329b-f1ec-44b6-8446-12bcf616d336,   类别=' App.Controllers.Jobs'

我很感激帮助解决这个问题,因为我花了更多的时间来解决这个问题,而不是实际的开发时间:-S

1 个答案:

答案 0 :(得分:0)

问题是您需要授权移动服务才能管理您的调度程序服务。这需要一组证书,因为从用户代码执行这些管理操作是不安全的。

有关详细信息,请参阅此文档:Authenticating Service Management Requests

Brady Gaster有一篇关于如何为Azure网站执行此操作的详尽分步博文,该过程与移动服务类似:Managing Web Sites from Web Sites using the Azure Management Libraries for .NET