2010년 8월 19일 목요일

User Profile 관련 Hotfix가 나왔습니다.

User Profile 관련해서 설정과 작동에 버그가 좀 있는 것 같았는데요.. 다행히 hotfix가 나왔네요.

http://support.microsoft.com/kb/983497/  ->기본적으로 한글로 번역기가 돌려 보여줍니다. 번역 품질이 쪼금 떨어지네요

http://support.microsoft.com/kb/983497/en-us  –> 영문

2010년 8월 2일 월요일

web.Navigation.TopNavigationBar is null

사이트 정의를 새로 만들면서 navigation을 새로 만들어야 하는 상황이었습니다.

Feature를 하나 생성 한 다음 TopNavigationBar에 접근해서 기존 메뉴 노드를 삭제하고 제가 필요한 링크를 다는 작업을 하는데 문제가 시작 되었습니다.

   1:  
   2: public override void FeatureActivated(SPFeatureReceiverProperties properties)
   3: {
   4:     SPNavigationNode nodeToAdd = new SPNavigationNode("Test1", web.Url + 
   5:     "/Pages/PageView.aspx");
   6:     web.Navigation.TopNavigationBar.AddAsLast(nodeToAdd);
   7: ...
   8: }


위 코드에서 web.Navigation.TopNavigationBar 개체가 자꾸 null이 들어 오는 것입니다.

조금 research를 해 봤습니다.

의외로 TopNavigationBar가 null인 상황이 자주 발생 하는 것 같았습니다.

http://stackoverflow.com/questions/2206240/sharepoint-quicklaunch-and-topnavigationbar-dissapearing

위 url에서는 아예 TopNavigationBar레코드가 사라지는 경우가 있으니 아예 만들라고 이야기를 하더군요.

http://statto1974.wordpress.com/2008/04/09/beware-of-deleting-global-navigation-nodes-in-spwebnavigationglobalnodes/

여기서는 navigaion node를 잘못 삭제하면 그런 증상이 발생한다고 하는데 제 경우에는 사이트 생성시 부터 TopNavigationBar가 보이지 않는 증상이었습니다.

SharePoint의 Navigation 개체는 기본적으로 root 아래에 3개의 Node가 제공 됩니다.

Home : 1000

Top Navigation Bar : 1002

Quick Lauch Bar : 1025

clip_image001

이상한 것은 Quick Lauch Bar 개체는 접근에 문제가 없다는 것이었습니다.

한참동안의 고민끝에 원인을 알아 냈는데요 이유는 onet.xml 에 NavBar 가 없어서 였습니다. 제 딴에는 Navigation을 새로 만든다고 onet.xml에 NavBars 를 몽땅 들어냈는데 TopNavigationBar의 경우에는 여기에 꼭 있어야 (ID=1000) web.Navigation.TopNavigationBar property로 노출이 됩니다.



   1:  
   2: <Project Title="DocExport" Revision="2" ListDir="" xmlns:ows="Microsoft 
   3: SharePoint" xmlns="http://schemas.microsoft.com/sharepoint/">
   4:     <NavBars>
   5:     <NavBar Name="SharePoint Top Navbar" ID="1002">
   6:     </NavBar>
   7:     </NavBars>


SharePoint의 길은 멀고도 험하다는 걸 느끼는 하루였네요 T.T

2010년 8월 1일 일요일

SharePoint가 작동중인 Application Pool Worker Process ID 찾기

SharePoint 기반 개발을 하다가 보면 Process를 attatch 해서 debugging을 해야 할 일이 자주 발생 합니다. 그런데 IIS에서 돌아가는 Application Pool이 많다 보면 어떤 worker process(w3p.exe)가 내 웹애플리케이션을 돌리고 있는지 알 수가 없습니다. 그럴 때는 iis의 appcmd를 사용해서 현재 작동중인 worker process정보를 알아 낼 수 있습니다.

C:\Windows\System32\inetsrv>appcmd list wp

image

2010년 7월 22일 목요일

SharePoint 2010 오역 모음

이번 SharePoint 2010에도 한글 버전의 잘못된 번역이 자꾸 눈에 띄는군요 요번에는 좀 정리를 해 보겠습니다.

1.Windows 토큰 서비스에 대한 클레임

중앙관리 -> 응용프로그램 관리 -> 서비스 응용 프로그램 탭-> 서버의 서비스 관리에 특정 서버에서 작동중인 서비스 목록을 볼 수 있습니다. 그 중에서 "Windows 토큰 서비스에 대한 클레임" 이라는 서비스 이름이 있네요 이 서비스 명은 "Claim to Windows Token Service"을 오역 한 것입니다. "클레임을 Windows 토큰으로 변환 하는 서비스"가 맞는 의미입니다.

clip_image001

2.도서관

처음에는 이 메뉴를 보고 SharePoint에 새로운 기능이 들어 간 것으로 알았습니다. --;; 원문은 Library 입니다만 한글로도 그동안 라이브러리라고 사용하고 있습니다. 이 2010에서도 그렇구요 아래 그림에서만 "도서관"이라고 번역을 했습니다. 번역의 일관성이 없네요

clip_image002

3. 사용자 프로필 동기화 서비스

요 부분은 오역이라기 보다는 버그에 가깝습니다. User Profile에 관련된 서비스는 User Profile Service와 User Profile Synchronization Service 이 두개가 있습니다. 그런데 두번째 만 한글로 “사용자 프로필 동기화 서비스”로 번역을 했습니다. 전 이 User Profile Synchronization Service가 RTM나오면서 User Profile Service로 통합 된 줄 알았습니다. 요것 때문에 며칠을 고생했네요. T.T

image

4.콘텐츠 형식에서의 목록정의

이건 SharePoint가 아니라 Visual Studio 2010의 SharePoint 프로젝트 템플릿 중 하나의 이름입니다.

image 

번역 전 원문은 “List Definition from Content Type” 입니다. 콘텐츠 형식을 이미 가지고 있을 때 이놈을 바탕으로 목록 정의를 만드는 용도입니다. 의미 전달이 제대로 되지 않고 있네요 “콘텐츠 형식으로 목록정의 만들기” 정도가 어떨까 합니다.

앞으로 눈에 띄는 대로 이 포스트에 업데이트 해 보도록 하겠습니다.

2010년 7월 21일 수요일

Secure Store Service

지난번 포스트에서 BCS를 통해 External Content Type을 사용하는 예제를 만들어 봤습니다. 그런 시나리오에서 제가 의도적으로 누락 했던 부분이 있습니다. 바로 BCS저장소에 접근 할 때 사용 하게 되는 인증 입니다. 그래서 서버 로컬에서 Administrator로 로그인 했을 땐 문제가 없지만 웹서버 바깥에서 로그인 하게 되면 DB인증이 실패 하는 경우가 발생 합니다.

BCS뿐 아니라 SharePoint는 Presentation layer의 역할을 가지고 있기 때문에 여러 데이터 소스로 부터 데이터를 취합 하는 시나리오가 자주 발생 하게 됩니다. 그럴 때 마다 가장 먼저 해결 해야 하는 부분이 데이터 소스에 접근 할 때 어떤 인증 방식으로 어떤 identity를 사용 할 것 인가 하는 문제 입니다.

이 때 SharePoint에서 제공 하는 솔루션이 Secure Storage Service 입니다. SSS는 2007 버전에서는 SSO서비스라고 이름 붙였습니다만 이름이 타 Web SSO와 혼동을 일으키는 부분도 있어서 이름을 바꾸어 업그레이드 되었습니다.

이제 지난 포스트에 이어서 SSS를 설정 하는 방법을 알아 보겠습니다.

중앙 관리에서 서비스 응용 프로그램 관리로 이동합니다.

clip_image001

만약 SharePoint 팜서비스 구성 마법사를 통해 Secure Store Service를 이미 만들어 둔 상태라면 아래 단계는 건너 뛰어도 됩니다.

clip_image002

서비스 응용 프로그램 이름과 데이터베이스 이름, 응용프로그램 풀 이름을 설정 합니다.

clip_image003

clip_image004

서비스 응용 프로그램 목록에서 제대로 Secure Store Service가 만들어 졌는지 확인이 가능합니다.

"관리"를 클릭해서 나머지 설정을 진행 합니다.

clip_image005

"새 키 생성"을 클릭합니다.

clip_image006

키의 암호를 지정합니다.

clip_image007

이제 "새 응용 프로그램"을 클릭

clip_image008

대상 응용 프로그램 ID, 표시 이름, 연락처 전자메일을 설정 합니다. 대상 응용 프로그램 형식은 "그룹:"을 선택 합니다. "그룹"은 Windows 기준으로 말씀드리자면 "Domain Users같은 그룹에 속한 사용자 아이디가 이 "MyDatabase"라는 응용프로그램에 접근 한다면" 이라는 의미 입니다.

clip_image009

clip_image010

대상응용 프로그램 관리자에는 적당히 게정을 지정을 지정 하시고 중요 한 부분은 "멤버" 부분입니다. 어떤 사용자 그룹이 이 "대상 응용 프로그램"을 사용할 것인가를 지정하는 부분입니다. 다시 말하자면 "Domain Users"그룹에 속한 사용자들이 이 "MyDatabase 대상 응용 프로그램"에 접근시에 작동 한다는 것을 뜻합니다.

clip_image011

"MyDatabase" 대상 응용 프로그램이 만들어 진 것을 확인 할 수 있습니다.

이제 이 대상프로그램에 접근한 사용자가 어떤 ID로 바꿀 것인가를 지정 합니다. "자격 증명 설정"을 클릭합니다.

clip_image012

자격 증명 설정 화면에서 대상 응용 프로그램에 접근시에 가장할 자격 증명을 지정 합니다.

clip_image013

이제 Secure Store Service에 MyDatabase라는 대상 응용프로그램 설정이 완료 되었습니다. 이 설정을 External Content Type에서 사용 해 보도록 하겠습니다.

clip_image014

clip_image015

clip_image016

앞서 말씀 드린 대로 Secure Store Service는 이전 버전의 SSO서비스 기능을 확장 해서 SharePoint 2010 의 인증 추가 기능은 Claim 티켓까지 사용 할 수 있도록 확장 되었습니다. 외부 시스템과의 연동 시에 Secure Store Service를 잘 활용 하면 보안 인증에 관련된 많은 부분을 손 쉽게 처리 할 수 있습니다.

2010년 7월 20일 화요일

Business Connectivity Service를 이용한 SQL DB 연동

 

BCS(Business Connectivity Service)에 대해서 좀 알아 보고 데모를 만들어 볼까 합니다.

BCS는 SharePoint 2007의 BDC가 업그레이드 된 것으로 이름을 BCS로 바꿨습니다.

이름을 바꿀 정도면 많은 부분들이 바뀌었겠지요. 가장 눈에 띄는 부분은 BCS 뒷단 데이터저장소에 대한 Write지원입니다. 기존에는 거의 Read Only작업만을 수행 할 수 있었지요

아울러 BCS구성을 위한 Desinger툴이 SharePoint Desinger 2010에 포함 되어 있다는 것 입니다. 기존에는 Application Definition파일을 수동으로 만들거나 Third party 툴을 사용 해야만 했었습니다. 이 SPD(SharePoint Desinger)안쪽의 툴이 CRUD작업의 코드를 자동으로 생성 해 주는 착한 일도 합니다.

이렇게 CRUD작업을 위해 BCS는 External Content Type이라는 개념을 도입해 SharePoint 목록(External List)과 바로 연결 할 수 있도록 구성 되어 있습니다.

MS SQL서버의 테이블을 외부 데이터로 설정하고 목록으로 노출 시키는 시나리오입니다.

먼저 샘플 DB를 생성 하도록 하겠습니다.

아래 스크립트로 MyDatabase라는 DB에 BCS 연결을 만들어 봅시다.

/************************************************

CREATE DATABASE [MyDatabase]

GO

Use MyDatabase

CREATE TABLE [dbo].[Customer](

[CustomerId] [int] NOT NULL,

[FullName] [varchar](50) NOT NULL,

[ModifyDate] [datetime] NOT NULL,

[CreateDate] [datetime] NOT NULL,

CONSTRAINT [PK_Customer] PRIMARY KEY CLUSTERED

(

[CustomerId] ASC

)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

) ON [PRIMARY]

CREATE TABLE [dbo].[Order](

[OrderId] [int] NOT NULL,

[CustomerId] [int] NOT NULL,

[Quantity] [int] NOT NULL,

[ModifyDate] [datetime] NOT NULL,

[CreateDate] [datetime] NOT NULL,

CONSTRAINT [PK_Order] PRIMARY KEY CLUSTERED

(

[OrderId] ASC

)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

) ON [PRIMARY]

GO

ALTER TABLE [dbo].[Order] WITH CHECK ADD CONSTRAINT [FK_Order_Customer] FOREIGN KEY([CustomerId])

REFERENCES [dbo].[Customer] ([CustomerId])

GO

ALTER TABLE [dbo].[Order] CHECK CONSTRAINT [FK_Order_Customer]

GO

ALTER TABLE [dbo].[Order] ADD CONSTRAINT [DF_Order_ModifyDate] DEFAULT (getdate()) FOR [ModifyDate]

GO

ALTER TABLE [dbo].[Order] ADD CONSTRAINT [DF_Order_CreateDate] DEFAULT (getdate()) FOR [CreateDate]

GO

//--------------------------------------

clip_image001

DB생성 이후 DB의 보안 설정에서 SharePoint 웹애플리케이션이 돌아가는 IIS Application Pool의 계정이 접근 권한을 적절히 줬는지 확인 해야 합니다.

이번 시나리오 에서는 이 MS SQL DB에 SharePoint Application Pool의 계정으로 접근 할 것이기 때문입니다.

SPD로 외부 데이터를 노출할 사이트를 엽니다.

"탑색" 창에서 "외부 컨텐츠 형식"을 클릭해서 "외부 컨텐츠 형식"을 새로 만듭니다.

clip_image002

clip_image003

clip_image004

SQL서버를 선택합니다.

clip_image005

clip_image006

데이터베이스 이름을 제대로 설정하고 "확인"을 누릅니다.

아래 화면에서 "모든 작업 만들기"를 통해 이테이블에 대한 CRUD작업을 자동으로 생성합니다.

clip_image007

clip_image008

clip_image009

각 필드에 대해서 "선택 컨트롤에 표시"를 체크 합니다.

clip_image010

"ModifyDate" "타임스탬프 필드"를 체크해서 해당 Row의 timestamp역할을 하도록 설정합니다.

필터 구성은 이 시나리오에서 사용하지 않으므로 바로 마치면 아래와 같이 각 CRUD작업이 생성되어 있음을 확인 할 수 있습니다.

clip_image011

Ctrl+s를 눌러서 저장하면 이제 폼을 구성 하고 목록으로 만들어 노출 할 수 있습니다.

clip_image012

clip_image013

clip_image014

목록 이름을 설정하고 확인을 클릭

이제 바로가기 메뉴에 "Customer" 목록이 나오는 것을 확인 할 수 있습니다. 하지만 아래와 같이 접근이 되지 않고 에러가 납니다.

clip_image015

중앙관리 사이트에서 해당 BCS개체의 사용 권한을 추가 해 줘야 합니다.

clip_image016

clip_image017

clip_image018

clip_image019

권한 설정 화면에서 찾을 이름을 "authenticated users"라고 치고 이름을 확인 합니다.

clip_image020

clip_image021

모든 사용자를 추가 하고 각 권한을 체크 한 후 확인을 클릭합니다.

이제 다시 Customer목록으로 돌아와 접근이 되는지 확인 합니다.

한번 새로운 데이터를 만들어 보겠습니다.

clip_image022

clip_image023

데이터를 입력하고 저장 합니다.

아래와 같이 목록에 입력된 내용이 표시 되는 것을 확인 할 수 있습니다.

clip_image024

DB에서 Query를 직접 해서 테이블에 입력이 되었는지 확인 해 보겠습니다.

clip_image025

위와 같이 DB입력 까지 된 것을 확인 했습니다.

SharePoint 2010의 BCS기능은 External Content Type과 External List의 도입으로 기존 LoB Application의 데이터를 SharePoint Presentation까지 별도의 코드가 거의 없이 바로 표현이 가능 할 뿐 아니라 Data의 CRUD전체 작업을 할 수 있습니다.

2010년 7월 5일 월요일

SharePoint 2010 Form기반 인증 설정하기

SharePoint 2010 에서 Form 기반 인증 하는 방법을 정리 해 봅니다.

SharePoint 2010은 Form기반 인증할 때 Security Token Service를 통한 Claim 기반 인증을 사용 하도록 변경 되었습니다.

설정을 해야 하는 web.config 가 하나 더 있는 셈입니다.

단계를 정리 해 보자면

1. 해당 Web Application의 Web.config 수정

2. STS Web Service Web.config 수정

3. 중앙 관리 사이트 Web.config 수정

4. Web Application에 관리자 계정 권한 추가

이런 순서라고 보시면 됩니다.

일단 Form기반 인증을 설정할 Web Application을 생성 하겠습니다.

SharePoint 중앙관리 사이트를 열어 응용 프로그램 관리 메뉴로 들어 갑니다.

clip_image002

새 웹 응용 프로그램 만들기 창에서 인증 값을 "클레임 기반 인증"으로 설정 하고 클레임 인증 유형에 "FBA"를 선택 합니다. - 번역은 "양식 기반 인증" 이군요 제발 form을 양식으로 번역 하지 않았으면 좋겠습니다만-

ASP.NET 멤버 자격 공급자 이름 에 "LdapMemeber", ASP.NET 역할 자격 공급자 이름에 "LdapRole"이라고 설정 합니다. 이 값은 web.config 파일들에서 설정할 이름이기 때문에 그 provider이름과 맞춰만 준다면 상관 없습니다.

clip_image004

클레임 인증 유형에서 Windows 인증 사용은 그대로 둬야 합니다. 빼면 검색엔진이 이 사이트를 검색 할 수 없게 됩니다.

clip_image006

나머지 값은 그대로 두고 확인을 눌러 응용 프로그램을 만듭니다. 이후에 바로 사이트 모음을 바로 만드는게 좋습니다.

clip_image008clip_image010clip_image012

이제 Memebership과 Role Provider설정을 각 web.config 에 할 순서 입니다.

방금 생성한 Web Application의 web.config 파일을 열어 아래와 같이 추가 합니다.

clip_image014

중앙 관리 사이트의 web.config 파일도 열어서 아래와 같이 설정 합니다.

<membership>

<providers>

<add name="LdapMember" type="Microsoft.Office.Server.Security.LdapRoleProvider, Microsoft.Office.Server,Version=14.0.0.0,Culture=neutral,PublicKeyToken=71e9bce111e9429c"

server="win2k8r2"

port="389"

useSSL="false"

userDNAttribute="distinguishedName"

userNameAttribute="sAMAccountName"

userContainer="CN=Users,DC=Contoso,DC=Com"

userObjectClass="person"

userFilter="(ObjectClass=person)"

scope="Subtree"

otherRequiredUserAttributes="sn,givenname,cn"/>

</providers>

</membership>

<roleManager enabled ="true" defaultProvider="AspNetWindowsTokenRoleProvider">

<providers>

<add name="LdapRole" type="Microsoft.Office.Server.Security.LdapMembershipProvider, Microsoft.Office.Server,Version=14.0.0.0,Culture=neutral,PublicKeyToken=71e9bce111e9429c"

server="win2k8r2"

port="389"

useSSL="false"

groupContainer="CN=Users,DC=Contoso,DC=Com"

groupNameAttribute="cn"

groupNameAlternateSearchAttribute="samAccountName"

groupMemberAttribute="member"

userNameAttribute="sAMAccountName"

dnAttribute="distinguishedName"

groupFilter="(ObjectClass=group)"

userFilter="(ObjectClass=person)"

scope="Subtree"

/>

</providers>

</roleManager>

마지막으로 STS Web Service의 web.config 파일을 설정 합니다. STS 서비스는 아래 그림과 같은 경로에서 찾을 수 있습니다.

clip_image016

clip_image018

clip_image020

STS의 web.config파일을 설정 할 때는 roleManager element의 defaultProvider 속성 값을 빼야 합니다.

clip_image022

이제 중앙관리 사이트의 응용 프로그램 관리 메뉴로 돌아 옵니다.

추가한 응용프로그램에 form기반 인증의 관리자를 추가 해야 합니다.

아래와 같이 추가한 웹 응용프로그램을 선택하고 "사용자 정책"을 선택합니다.

clip_image024

clip_image026

영역선택에서 "기본"을 선택합니다.

clip_image028

사용자 선택에서 주소록 아이콘을 클릭합니다.

clip_image030

Administrator를 검색하면 아래와 같이 AD와 Form두개의 검색 결과가 나오는 것을 확인 해 볼 수 있습니다.

clip_image032

Form인증의 Administrator을 추가 하고 확인 한 후 빠져나옵니다.

이제 해당 응용프로그램을 브라우져를 통해 들어가 보면 아래와 같이 자격 증며을 선택 하는 화면이 나오고 "양식 인증"을 선택 하면 그 아래와 같이 기본 login 화면이 나타나게 됩니다.

clip_image034

clip_image036

제대로 인증에 성공하면 아래와 같이 환영 메시지를 볼 수 있습니다.

clip_image038