Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 发布后未加载SharePoint上的图像_C#_Asp.net Mvc_Azure_Authentication_Sharepoint - Fatal编程技术网

C# 发布后未加载SharePoint上的图像

C# 发布后未加载SharePoint上的图像,c#,asp.net-mvc,azure,authentication,sharepoint,C#,Asp.net Mvc,Azure,Authentication,Sharepoint,我正在从SharePoint检索用户配置文件图片,然后在页面上显示这些用户,将img元素中的src属性设置为图像的url 在VS中调试时,它可以完美地工作 但是,在我发布到Azure之后,图像不会加载。奇怪的是,在我点击图片链接后,它似乎对我进行了身份验证,然后图片开始加载 我怎样才能自动传递当前用户的凭据,这样我的用户就不必在web应用程序中看到他们之前导航到图像本身 元素的示例: <img src="https://companyname-my.sharepoint.com:443/U

我正在从SharePoint检索用户配置文件图片,然后在页面上显示这些用户,将
img
元素中的
src
属性设置为图像的url

在VS中调试时,它可以完美地工作

但是,在我发布到Azure之后,图像不会加载。奇怪的是,在我点击图片链接后,它似乎对我进行了身份验证,然后图片开始加载

我怎样才能自动传递当前用户的凭据,这样我的用户就不必在web应用程序中看到他们之前导航到图像本身

元素的示例:

<img src="https://companyname-my.sharepoint.com:443/User%20Photos/Profile%20Pictures/firstname_lastname_company_com_MThumb.jpg?t=63655312814" class="userPic">

当前登录的用户显然是受信任的,因为它在访问该url后会工作-我不能向该地址添加某种参数以自动执行吗


非常感谢您的帮助。

对于Azure存储,如果图像已保存为私有,则需要sharedaccesssignature

对于我自己网站上的任何图片,我都有一个如下的类:

public string GetAzureStoreImage(string fileName, string containerName)
{
        string imageUrl = string.Empty;

        // Connect to cloud storage account
        CloudStorageAccount storageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("YourStoredConnectionString"));

        // Connect blob client
        CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

        // Connect to container
        CloudBlobContainer container = blobClient.GetContainerReference(containerName);

        // Get reference for current file
        CloudBlockBlob blob = container.GetBlockBlobReference(fileName);

        if (blob.Exists())
        {
            // Create access token for file share
            var sasToken = blob.GetSharedAccessSignature(new SharedAccessBlobPolicy()
            {
                Permissions = SharedAccessBlobPermissions.Read,
                SharedAccessExpiryTime = DateTime.UtcNow.AddMinutes(10),
            }, new SharedAccessBlobHeaders()
            {
                ContentDisposition = "attachment; filename=" + fileName
            });

            // Collect url and download file
            imageUrl = string.Format("{0}{1}", blob.Uri, sasToken);
        }

        return imageUrl;
}
您需要为它们包含Microsoft.WindowsAzure.Storage和Microsoft.WindowsAzure.Storage.Blob引用,但这将提供一个临时10分钟的令牌来访问该文件,然后允许返回的“imageurl”作为您的图像源

最后,文件名就是您希望从Azure存储中收集的文件名,containerName是当前文件的“存储桶”


如果所有用户都有自己的安全令牌来访问图像,那么您可能还需要根据当前用户信息传入另一个参数,这些图像应该附加到您的连接字符串中。

谢谢您的回答。如何获取该连接字符串?它在azure门户中可用吗?是的,因此您可以对连接字符串执行两个选项,您可以在函数本身中解析它(通常是不好的做法),并且看起来像:const string ConnectionString=“DefaultEndpointsProtocol=https;AccountName=account name;AccountKey=account key”;取自或取决于您的IDE,您可以将您的存储帐户作为连接服务添加到您的项目中(当您添加服务时,有一个特定的选项可以直接连接到您的Azure存储帐户)。谢谢rando,我还有一个关于“bucket”和“filename”的问题。我只有图像的url-它包含这两个元素吗?嘿@Bassie这个url让事情变得棘手,Azure服务的工作方式更像是一个文件服务器(有点像你的windows文件浏览器),其中bucketName是你的文件夹结构(或者像你的c:等等),而你的文件名就是文件本身。如果您的url包含文件名,您可以进行字符串提取,只提取文件位置并将其推入其中。你需要找到你的bucketname,如果你只有一个bucketname,那么你可以在函数中硬设置它,而不是传入它。你的文件名将是用户%20Photos/Profile%20Pictures/firstname\u lastname\u company\u com\u MThumb.jpg(基于上面问题中的链接),因此,您需要将文件名拆分为仅提取字符串的该部分。