문제

* *설명.응용 프로그램 == 사이트 정의.데이터베이스에 직접 액세스할 수 없습니다. ** 코딩 목록 액세스에 새로운 접근 방식을 사용하는 SharePoint 응용 프로그램을 만들었습니다.나는 정확한 방식으로 데이터 상호 작용을 제어할 수 있는 방식으로 구성했습니다.

예를 들어 제목, 요약 등과 같은 일반적인 메타데이터가 있는 Post라는 클래스가 있습니다.

Inside Post는 새 게시물을 만드는 데 사용할 미리 형식이 지정된 SPListItem을 반환하는 NewPost라는 정적 메서드입니다.

public static SPListItem NewPost(string Title,string Summary)
{
   Posts = CoreLists.Posts();
   var item = Posts.AddItem();
   var item["Alias"] = SPContext.Current.Web.CurrentUser.LoginName;
   return item;
}

CoreLists라는 도우미 클래스를 통해 SPList를 가져오고 있음을 알 수 있습니다.

public static class CoreLists
{
   public static SPList Posts()
   {
      return SPContext.Current.Web.GetList(SPContext.Current.Web.ServerRelativeUrl + "/lists/Posts");
   }
}

이것은 멋진 깨끗한 데이터 방법을 만듭니다.내가 겪고 있는 문제는 이러한 메서드를 호출하는 적절한 방법을 찾을 수 없다는 것입니다. SPSecurity.RunWithElevatedPrivileges

SPSecurity.RunWithElevatedPrivileges return 블록과 함께 작동할 수 없기 때문에 새 목록 항목을 만들려고 하면 매번 실패합니다.

내 목록을 숨기려고 하기 때문에 이렇게 하는 것입니다.나는 사람들이 내가 만들고 있는 UI를 통해서만 접근할 수 있기를 바랍니다.관리자만 항목을 생성할 수 있도록 허용하고, SecurityBits를 사용하여 목록 항목 작성자에게만 항목 편집을 허용함으로써 URL 해킹으로부터 시스템을 더욱 잠그고 싶습니다.

따라서 모든 목록 항목은 시스템 계정에 의해 생성되며 항목을 사용자와 일치시킬 수 있는 별칭이라는 필드가 있습니다.

전체 데이터 액세스 계층을 다시 생각해야 합니까?목록 액세스를 제한하기로 한 결정이 더 깨끗한 데이터 액세스 계층에 대한 요구와 절대적으로 충돌합니까?

도움이 되었습니까?

해결책

너는 사용한다 SPContext.Current.Web 안에 SPSecurity.RunWithElevatedPrivileges 대리자?

그것은 작동하지 않을 것입니다.물건 가져오기 SPContext 다음과 같은 컨텍스트를 가진 개체를 제공합니다. 현재 로그온한 사용자, 높은 곳이 아닙니다.즉, 다음에서 가져온 개체를 사용하여 새 목록 항목을 만드는 경우 SPContext, 해당 항목은 현재 로그온한 사용자의 보안 컨텍스트에서 생성되며 해당 항목을 생성한다고 생각하는 승격된 사용자가 아닙니다.

sharepoint\system을 사용하여 목록 항목을 생성하려면 SPSecurity.RunWithElevatedPrivileges 위임 내에서 새 SPSite/SPWeb 개체를 열고 대신 해당 개체로 작업해야 합니다.

이것을 변경해보세요:

   public static SPList Posts() 
   { 
      return SPContext.Current.Web.GetList(SPContext.Current.Web.ServerRelativeUrl + "/lists/Posts"); 
   } 

이에:

   public static SPList Posts() 
   { 
        using( var s = new SPSite(SPContext.Current.Site.ID)
        {
            using( var w = SPSite.OpenWeb(SPContext.Current.Web.ID)
            {
                 var postsList = w.Lists.TryGetList("Posts"); 
                 if( postsList != null )
                      return postsList;
                 else
                    /* do proper error handling */
            }
        }
    }

이제 귀하의 post.AddItem()은 올바르게 승격된 컨텍스트를 사용하여 목록 항목을 생성해야 합니다.

MSDN에서 권한 상승에 대해 자세히 알아보세요.http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spsecurity.runwithelevatedprivileges.aspx

다른 팁

rwep을 사용하지 마십시오.당신은 그것을 필요로하지 않습니다.

숨겨진 목록에는 액세스 할 특별한 코딩이 필요하지 않습니다.현재 사용자가 목록에 대한 사용 권한이있는 경우 다른 목록과 같이 숨겨진 목록에 액세스하십시오.

현재 사용자가 목록에 대한 권한이없고 코드를 통해 업데이트를 프록시하려는 경우 시스템 계정을 가장해야합니다.또한 보안 경계에서 객체를 전달해서는 안됩니다.데이터 계층에 통과하는 데이터 전송 객체를 만드는 것을 제안합니다.

Vedrans Re UI / Security가 매우 옳습니다. 보안 시스템을 다시 작성하는 경우 곡물에 대해 일하고 있습니다. 그러나 은 여전히 보안 (및 다른 SharePoint 혜택)을 활용하고자하므로 완전히 정신이 아닙니다.

더 많은 SharePoint 기반 아키텍처 - 게시 사이트를 사용하십시오.이것은 당신에게 다음을 제공합니다 :

  1. 목록 등에 대한 표준 SharePoint UI - 이것은 관리자 '무대'보기입니다.
  2. 별도의 마스터 페이지 / ui가있는 페이지 라이브러리 - 이것은 '응용 프로그램'인터페이스입니다.

    기본값 (모든 인증 된 사용자) 사이트에 대한 뷰어 액세스를 가져옵니다.'Admin'사용자는 기여자 / 명시 적 권한을 목록에 가져옵니다.

    삿 니터는 응용 프로그램 인터페이스의 사용자 정의 웹 파트 / 코드를 통해 사이트 데이터 만 액세스 할 수 있습니다.

전체 개념이 잘못되었습니다.

자신의 UI 및 보안을 개발하는 경우 SharePoint를 사용하는 이유는 무엇입니까?SQL 사용은 훨씬 깨끗합니다.

현재 사용자가 SharePoint \ System로 액세스 할 수 있도록 Code SharePoint Security를 사용할 때마다 Code SharePoint 보안을 사용할 때마다 손상됩니다.

btw SPSecurity.RunWithElevatedPrivileges 에서 실행할 때 'creator'을 설정할 수 있습니다.

//First store current user
SPUser currentUser = SPContext.Current.Web.CurrentUser;

SPSecurity.RunWithElevatedPrivileges(delegate 
{
    using (SPSite elevatedSite = new SPSite(SPContext.Current.Site.Url))
    using (SPWeb targetWeb = elevatedSite.OpenWeb(webUrl))
    {
       //Code to get your item or to add a new one

       // Replace 'System Account' with current user
       item["Author"] = currentUser;
       item["Editor"] = currentUser;
       item.SystemUpdate();
    }
});
.

추가 :

더 이상의 오해를 피하기 위해 : SQL을 사용하여 SharePoint 데이터베이스는 아니지만 다른 다른 SQL 데이터베이스를 의미하지 않았습니다.왜?사용자 정의 UI를 사용하고 있으므로 사용자 정의 보안 검사가 숨겨져 있으므로 사용자는 사용자가 정렬, 필터링 등과 같은 SP OOTB 기능을 사용할 수 없으므로 검색도 옵션이 아닙니다. -> 나는 정말로 SharePoint를 사용하는 이점을 보이지 않습니다.데이터 저장소로서.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 sharepoint.stackexchange
scroll top