我有一个控制台应用程序,可以在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
答案 0 :(得分:0)
问题是您需要授权移动服务才能管理您的调度程序服务。这需要一组证书,因为从用户代码执行这些管理操作是不安全的。
有关详细信息,请参阅此文档:Authenticating Service Management Requests
Brady Gaster有一篇关于如何为Azure网站执行此操作的详尽分步博文,该过程与移动服务类似:Managing Web Sites from Web Sites using the Azure Management Libraries for .NET