C# GetAzureADAppOnlyAuthenticatedContext未释放证书的文件句柄
我的方法接收base64格式的文件,将其转换为字节数组,然后转换为webappp中的本地文件 然而,我需要删除该文件,因为它是临时的,但我总是得到上面的错误C# GetAzureADAppOnlyAuthenticatedContext未释放证书的文件句柄,c#,asp.net,.net,C#,Asp.net,.net,我的方法接收base64格式的文件,将其转换为字节数组,然后转换为webappp中的本地文件 然而,我需要删除该文件,因为它是临时的,但我总是得到上面的错误 public async Task<IHttpActionResult> AddGlobalDesignTenant([FromBody]GlobalDesignTenant globaldesigntenant) { var telemetry = new TelemetryClie
public async Task<IHttpActionResult> AddGlobalDesignTenant([FromBody]GlobalDesignTenant globaldesigntenant)
{
var telemetry = new TelemetryClient();
try
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
string domainUrl = globaldesigntenant.TestSiteCollectionUrl;
string tenantName = domainUrl.Split('.')[0].Remove(0, 8);
globaldesigntenant.TenantName = tenantName;
var globalDesignTenantStore = CosmosStoreHolder.Instance.CosmosStoreGlobalDesignTenant;
byte[] data = Convert.FromBase64String(globaldesigntenant.base64CertFile);
if (File.Exists(HttpRuntime.AppDomainAppPath + "/Temp/" + globaldesigntenant.TenantName + ".pfx"))
{
File.Delete(HttpRuntime.AppDomainAppPath + "/Temp/" + globaldesigntenant.TenantName + ".pfx");
}
File.WriteAllBytes(HttpRuntime.AppDomainAppPath + "/Temp/" + globaldesigntenant.TenantName + ".pfx", data);
try
{
using (var cc = new AuthenticationManager().GetAzureADAppOnlyAuthenticatedContext(globaldesigntenant.TestSiteCollectionUrl,
globaldesigntenant.Applicationid,
globaldesigntenant.TenantName+".onmicrosoft.com",
HttpRuntime.AppDomainAppPath + "/Temp/" + globaldesigntenant.TenantName + ".pfx",
globaldesigntenant.CertificatePassword))
{
cc.Load(cc.Web, p => p.Title);
cc.ExecuteQuery();
Console.WriteLine(cc.Web.Title);
}
}
catch (Exception ex)
{
return BadRequest("Cant authenticate with those credentials");
}
KeyVaultHelper keyVaultHelperPFX = new KeyVaultHelper();
await keyVaultHelperPFX.OnCreateAsync("GlobalDesignTenantPFXFileBAse64"+ tenantName, globaldesigntenant.base64CertFile);
globaldesigntenant.SecretIdentifierBase64PFXFile = keyVaultHelperPFX.SecretIdentifier;
KeyVaultHelper keyVaultHelperPassword = new KeyVaultHelper();
await keyVaultHelperPassword.OnCreateAsync("GlobalDesignTenantCertPassword" + tenantName, globaldesigntenant.CertificatePassword);
globaldesigntenant.SecretIdentifieCertificatePassword = keyVaultHelperPassword.SecretIdentifier;
globaldesigntenant.CertificatePassword = string.Empty;
globaldesigntenant.base64CertFile = string.Empty;
File.Delete(HttpRuntime.AppDomainAppPath + "/Temp/" + globaldesigntenant.TenantName + ".pfx");
var added = await globalDesignTenantStore.AddAsync(globaldesigntenant);
return Ok(added);
}
catch (Exception ex)
{
string guid = Guid.NewGuid().ToString();
var dt = new Dictionary<string, string>
{
{ "Error Lulo: ", guid }
};
telemetry.TrackException(ex, dt);
return BadRequest("Error Lulo: " + guid);
}
}
public异步任务AddGlobalDesignTenant([FromBody]GlobalDesignTenant GlobalDesignTenant)
{
var telemetry=新遥测客户端();
尝试
{
如果(!ModelState.IsValid)
{
返回请求(ModelState);
}
字符串domainUrl=globaldesigntenant.TestSiteCollectionUrl;
字符串tenantName=domainUrl.Split('.')[0]。删除(0,8);
globaldesigntenant.TenantName=租户名称;
var globalDesignTenantStore=CosmosStoreHolder.Instance.CosmosStoreGlobalDesignTenant;
字节[]数据=Convert.FromBase64String(globaldesigntenant.base64CertFile);
如果(文件.Exists(HttpRuntime.AppDomainAppPath+“/Temp/”+globaldesigntenant.TenantName+”.pfx)))
{
Delete(HttpRuntime.AppDomainAppPath+“/Temp/”+globaldesigntenant.TenantName+”.pfx”);
}
文件.writealBytes(HttpRuntime.AppDomainAppPath+“/Temp/”+globaldesigntenant.TenantName+”.pfx),数据);
尝试
{
使用(var cc=new AuthenticationManager().GetAzureADAppOnlyAuthenticatedContext(globaldesigntenant.TestSiteCollectionUrl,
globaldesigntenant.Applicationid,
globaldesigntenant.TenantName+“.onmicrosoft.com”,
HttpRuntime.AppDomainAppPath+“/Temp/”+globaldesigntenant.TenantName+”.pfx“,
globaldesigntenant.CertificatePassword)
{
cc.Load(cc.Web,p=>p.Title);
cc.ExecuteQuery();
Console.WriteLine(cc.Web.Title);
}
}
捕获(例外情况除外)
{
返回BadRequest(“无法使用这些凭据进行身份验证”);
}
KeyVaultHelper KeyVaultHelperFX=新的KeyVaultHelper();
等待keyVaultHelperPFX.OnCreateAsync(“GlobalDesignTenantPFXFileBAse64”+tenantName,globaldesigntenant.base64CertFile);
globaldesigntenant.SecretIdentifierBase64PFXFile=keyVaultHelperPFX.secretidentier;
KeyVaultHelper keyVaultHelperPassword=新的KeyVaultHelper();
等待KeyVault HelperPassword.onCreateAync(“GlobalDesignEntantPassword”+租户名称,GlobalDesignEntant.CertificatePassword);
globaldesigntenant.secretIdentificatePassword=keyVault HelperPassword.SecretIdentifier;
globaldesigntenant.CertificatePassword=string.Empty;
globaldesigntenant.base64CertFile=string.Empty;
Delete(HttpRuntime.AppDomainAppPath+“/Temp/”+globaldesigntenant.TenantName+”.pfx”);
var added=await globalDesignTenantStore.AddAsync(globaldesigntenant);
返回Ok(已添加);
}
捕获(例外情况除外)
{
字符串guid=guid.NewGuid().ToString();
var dt=新字典
{
{“错误Lulo:,guid}
};
遥测.跟踪异常(ex,dt);
返回BADDREQUEST(“错误Lulo:+guid”);
}
}
我可能弄错了,但这似乎是个bug
注意下面一行
var certfile = System.IO.File.OpenRead(certificatePath);
这将返回一个FileStream
,它似乎永远不会关闭或处理
解决方法
首先读取数据(确保您已处理),然后对
GetAzureADAppOnlyAuthenticatedContext
使用其他重载之一。您需要将其分为两个过程,一个是获取数据并将数据写入本地文件,然后在完成此过程后,处理文件对象。第二个过程是删除该临时文件,这样就可以了,因为文件对象已经被释放并且可以访问。您的问题应该是,GetAzureADAppOnlyAuthenticatedContext
没有释放证书文件的句柄
var certfile = System.IO.File.OpenRead(certificatePath);