关于sharepoint站点中点击word附件弹出用户密码的解决办法

在sharepoint站点建设中,sharepoint的List有自己的附件添加机制。

不过在实际项目中,可能不用sharepoint自己的附件添加。

而是自己设计一套附件上传添加,比如把附件添加至自己设计的一套文档库

关于sharepoint站点中点击word附件弹出用户密码的解决办法_第1张图片

上图的DocLibLink就是自己设计用于存储附件的文档库

这样的话就会有一个问题,就是在IE中访问附件中的word文档的话,IE就会弹出一个用户密码框进行验证。

比如点击某篇文章的附件,

关于sharepoint站点中点击word附件弹出用户密码的解决办法_第2张图片

访问诸如http://www.baoan.edu.cn/riseupload/uploadfile/BFA81039-0000-0000-4583-04FB00004C4.doc的这篇文章

在IE中就会出现

关于sharepoint站点中点击word附件弹出用户密码的解决办法_第3张图片

按照网上的相关资料,这是因为IE中访问word的话需要向服务器传递用户密码以验证权限,

如果服务器端已经设置了可匿名访问的话,关闭用户密码其实是可以访问相关的附件的。

这样的话中间就多了一个弹出用户密码弹出框的过程。

用户就提出在打开附件时不要弹出用户密码框的要求。

查了一些资料及问了相关这方面的相关人士,解决这个问题可以从两方面入手。

1.可以设置客户端IE设置,

可以在安全设置里面选择anonymous logon,默认的时候是Automatic logon only in Intranet zone

 

关于sharepoint站点中点击word附件弹出用户密码的解决办法_第4张图片

这样的话IE打开这个文档时就会以匿名用户访问这个文档,不会再弹出用户验证框。

2.在服务器端写IHttpHandler的处理.

代码
   
   
namespace BA.WebClient.WebCommon
{
class FileHandler : IHttpHandler
{
#region IHttpHandler 成员

public bool IsReusable
{
get { return true ; }
}

public static byte [] StreamToBytes(Stream stream)
{
byte [] bytes = new byte [stream.Length];
stream.Read(bytes,
0 , bytes.Length);

// 设置当前流的位置为流的开始
stream.Seek( 0 , SeekOrigin.Begin);
return bytes;
}

public void ProcessRequest(HttpContext context)
{
HttpResponse Response
= context.Response;
HttpRequest Request
= context.Request;

try
{
string FileName = Request.Path;

SPSite siteColl
= SPContext.Current.Site;
SPWeb site
= SPContext.Current.Web;

SPSecurity.RunWithElevatedPrivileges(
delegate ()
{
using (SPSite ElevatedsiteColl = new SPSite(siteColl.ID))
{
using (SPWeb web = ElevatedsiteColl.OpenWeb(site.ID))
{
SPFile file
= web.GetFile(FileName);
string FullFileName = HttpContext.Current.Server.MapPath(FileName);

FileInfo DownloadFile
= new FileInfo(FullFileName);
if (file.Exists)
{
System.IO.Stream sourceStream
= file.OpenBinaryStream();
byte [] buffer = new byte [ 1024 ];
buffer
= StreamToBytes(sourceStream);

Response.Clear();
Response.ClearHeaders();
Response.Buffer
= false ;
Response.ContentType
= " application/octet-stream " ;
Response.AppendHeader(
" Content-Disposition " , " attachment;filename= " + HttpUtility.UrlEncode(web.Url + file.ServerRelativeUrl, System.Text.Encoding.ASCII));
Response.AppendHeader(
" Content-Length " , file.Length.ToString());
Response.OutputStream.Write(buffer,
0 , buffer.Length);
Response.Flush();
Response.End();
}
else if (DownloadFile.Exists)
{
Response.Clear();
Response.ClearHeaders();
Response.Buffer
= false ;
Response.ContentType
= " application/octet-stream " ;
Response.AppendHeader(
" Content-Disposition " , " attachment;filename= " + HttpUtility.UrlEncode(DownloadFile.FullName, System.Text.Encoding.ASCII));
Response.AppendHeader(
" Content-Length " , DownloadFile.Length.ToString());
Response.WriteFile(DownloadFile.FullName);
Response.Flush();
Response.End();
}
else
{
// 文件不存在
}
}
}
});
}
catch (Exception ex)
{
// 打开时异常了
throw ex;
}
}

#endregion
}
}

然后在网站的web.config加入代码

  
  
< add verb ="GET" path ="*.doc" type ="BA.WebClient.WebCommon.FileHandler, BA.WebClient.WebCommon" />

让所有对doc文档的处理方式都以上述代码方式处理。

其实上述代码的意思就是说把doc文档写入到文件流中,然后输出此文件流,从而避免了在IE中直接打开doc文档,

从而就免去了IE验证的步骤。

 

来源:http://www.cnblogs.com/poissonnotes/archive/2010/09/15/1827210.html

你可能感兴趣的:(SharePoint)