限制从未经过身份验证的Extranet用户访问Sitecore Media资产

时间:2013-01-18 23:34:31

标签: customization sitecore

我希望对媒体资产的请求表现得像对页面/项目的请求。也就是说,如果用户未登录,则会将其退回到登录页面,并将引荐返回到他们最初请求的项目。

我可以通过删除extranet /匿名用户的读取权限来限制对媒体资产的访问。这有效,但用户被发送到" noaccess"页面(在配置中定义)然后返回到使用" noaccess"页面作为引用者。我想知道是否有办法让媒体请求首先检查身份验证而不是访问级别(可能使用自定义处理程序)或扩展#34; no access"请求已处理?

1 个答案:

答案 0 :(得分:4)

我检查了Sitecore.Resources.Media.MediaRequestHandler类的代码,它的工作原理如下:

  1. Sitecore尝试获取mediaItem,然后检查用户AccessRights
  2. 如果访问权限正常,则会处理该项目
  3. 如果用户没有足够的AccessRights,Sitecore会重定向到<site name="yoursite" loginPage="">部分中设置的网站登录页面。如果未设置此loginPage,Sitecore将重定向到web.config中的<setting name="NoAccessUrl" />设置。
  4. 我假设您已将loginPage设置设置为登录页面。 如果这不是所需的行为,您可以为MediaRequestHandler创建自定义处理程序。

    从MediaRequestHandler中获取处理访问权限不足的部分代码:

    using (SecurityDisabler securityDisabler = new SecurityDisabler())
    
                    {
                        media = MediaManager.GetMedia(mediaRequest.MediaUri);
                    }
                    if (media != null)
                    {
                        Assert.IsNotNull(Context.Site, "site");
                        if (Context.Site.LoginPage != string.Empty)
                        {
                            loginPage = Context.Site.LoginPage;
                        }
                        else
                        {
                            loginPage = Settings.NoAccessUrl;
                        }
                        itemNotFoundUrl = loginPage;
                    }
                    else
                    {
                        itemNotFoundUrl = Settings.ItemNotFoundUrl;
                    }
                    if (!Settings.RequestErrors.UseServerSideRedirect)
                    {
                        HttpContext.Current.Response.Redirect(itemNotFoundUrl);
                    }
                    else
                    {
                        HttpContext.Current.Server.Transfer(itemNotFoundUrl);
                    } 
    

    有关如何创建自定义MediaHandler的信息,请参阅this blogpost