使用Custom HttpHandler重定向Sharepoint中的用户

时间:2010-04-08 08:58:19

标签: c# sharepoint sharepoint-2007

如果用户访问网络中的某组网页,我需要将用户重定向到其他网页。有一个条件:我不允许触摸IIS。我已经google了一下,发现了一个名为WSS 3.0的自定义HttpHandler的东西。这听起来像我可以用来捕获用户输入的URL(最恶意的方式来访问应该真正被重定向的页面)并将它们重定向到另一个页面/ web。但是还没有机会使用它,我想知道我是否在正确的轨道上使用自定义HttpHandler使用C#将用户重定向到Sharepoint中的不同页面?

非常感谢。

3 个答案:

答案 0 :(得分:3)

IIS使用

HttpHandler来“处理”不同的文档类型,例如,您有单独的.asmx句柄,.aspx处理程序,.ascx处理程序等。< / p>

查看SPUtility.Redirect

  

只要您想将用户定向到其他页面,就可以使用SPUtility.Redirect方法。例如,您可以创建一个确定用户角色成员身份的登录页面,并根据该信息将其重定向到适当的页面。或者,根据用户浏览器发出的查询字符串的内容,您可以将它们重定向到可以处理查询字符串的页面,例如搜索中心结果页面。

或者,您可以查看Using Disposable Windows SharePoint Services Objects

<强> - 编辑 -

这是对你的评论的回应;你在思考正确的方向

  1. 创建自定义HttpHandler; Example 1Example 2
  2. 每当用户请求网址时,您的自定义HttpHandler就会处理该网址。
  3. Redirect()如果你喜欢这个网址,否则就是。
  4. 但是为了让你的Custom HttpHandler工作,应首先调用它 - 所以在配置文件中你必须提供path中的值。通常在这里添加扩展名。但您可以使用*替换它以适用于所有请求。我相信这会奏效。

    <httpHandlers>
        <add verb="*" path="*.aspx" type="MyNameSpace.MyHttpHandler, MyAssemblyName" />
    </httpHandlers>
    

    <强> - 编辑 -

    这是对你的评论的回应。假设您已“访问”页面以便您可以在其中编写javascript,则可以按照以下方式使用javascript。

    <script language=JavaScript>
    function RedirectIfUnAuthorized()
    {
        //Get the location of the current page.
        var currentUrl = new String( document.location.href ) 
    
        //See if it belongs to the urls you are looking for; redirect if so.
        if (currentUrl == "http://www.thisUrl.com/page1.aspx") {Response.Redirect("http://www.GOOGLE.com")}
        if (currentUrl == "http://www.thisUrl.com/page2.aspx") {Response.Redirect("http://www.BING.com")}
        if (currentUrl == "http://www.thisUrl.com/page3.aspx") {Response.Redirect("http://www.someother.com")}
    }
    </script>
    

    您可以在页面的OnLoad活动中调用上述javascript。

答案 1 :(得分:1)

您是否可以在服务器上部署代码?或者那也是感人的IIS?

(SharePoint也会对web.config进行更改。如果您允许部署代码,那么您也可以。如果您不告诉管理员,他们可能甚至不会注意到。)

您可以通过SPWebConfigModification“部署”您的web.config更改,并以此方式部署任何web.config重定向或httphandler。

答案 2 :(得分:0)

  

HTTP处理程序是终点   ASP.NET管道中的对象和   HTTP处理程序基本上处理   请求并生成响应。对于   例如,ASP.NET页面是一个HTTP   处理程序。

     

HTTP模块也是对象   参与管道,但他们的工作   在HTTP Handler之前和之后   它的工作,并产生额外的   管道内的服务(for   关联会话的示例   HTTP处理程序执行前的请求,   然后保存会话状态   HTTP处理程序完成了它的工作,是   基本上由HTTP模块完成,   SessionStateModule)

在您的情况下,HTTPModule将需要重定向另一个网页。

using System;
using System.Web;
using System.Web.UI;
using System.Configuration;
using Microsoft.Practices.EnterpriseLibrary.Data;
using System.Data;

namespace CustomHttpModule
{
    public class HttpModuleImplementation : IHttpModule
    {
        #region IHttpModule Members

        public void Dispose()
        {

        }

        public void Init(HttpApplication context)
        {
            if (context == null)
                throw new ArgumentNullException("Context == null");

            context.AuthorizeRequest += new EventHandler(this.ProcessRequestHandler);
        }
        #endregion

        private void DummpRequest(object sender, EventArgs e)
        {
        }
        //first check that user.identity record exist in database
        //If not then forward user to User registration page
        private void ProcessRequestHandler(object sender, EventArgs e)
        {
            try
            {
                HttpApplication context = (HttpApplication)sender;
                string strAbsoluteUri = context.Request.Url.AbsoluteUri.ToLower();
                                //check if request is accessing aspx page
                if (strAbsoluteUri.Substring(strAbsoluteUri.Length - 5, 5).Contains(".aspx"))
                {
                    string userName = context.User.Identity.Name;
                    //replace Test Module with DB call to validate user data
                    if (!CheckUserInDb(userName))
                    {
                        if (!strAbsoluteUri.Contains("mypage.aspx"))
                            redirectToRegistrationPage(context);
                    }
                }
            }
            catch (Exception ex)
            {
            }
        }
        private void redirectToRegistrationPage(HttpApplication context)
        {
            context.Response.Redirect("http://" + context.Request.ServerVariables["HTTP_HOST"].ToString() + "Regpage.aspx", false);
        }

        private bool CheckUserInDb(string userName)
        {
                    return true;
        }
    }
}

在SharePoint虚拟目录web.config文件中,您必须在httpModules:

部分下输入以下条目
<add name="CustomHttpModule" type="CustomHttpModule.HttpModuleImplementation, CustomHttpModule" />