2008年3月

2008年3月31日 (月)

MOSS 上でシングルサインオンを利用できるように、大まかに次のような設定を行います。

  1. Microsoft Single Sign-On Service の起動
  2. シングル サインオン データベースの作成
  3. マッピングするアカウントの定義

3.は、次の部分で設定します。

  • 「SharePoint 3.0 サーバーの全体管理」の「サーバー構成の管理」- 「シングル サインオン の管理」- 「企業アプリケーション定義の設定の管理」

この企業アプリケーション定義の設定の管理で新しくアイテムを作成する際に、アカウントの種類として「グループ」もしくは「個人」などが選択できます。前者が多対一マッピングであり、後者が一対一マッピングです。今回は、一対一マッピングを設定するため「個人」を選択します(なお、バックエンドシステムは SQL Server を使用しているため忘れずに "Windows 認証" も有効にしておきます)。

[図.企業アプリケーション定義の設定の管理]

Sso1

この設定ができあがれば、あとは個人のアカウント情報がそのままバックエンドに渡せるようになるはずだと考えがちです。実は、そうではなく、SSO のデータベースは自動的にマッピングされるアカウントが登録されることはないのです。つまり、一対一であるログオンユーザーアカウントをそのままバックエンドに渡すためにも、なんらかの方法で SSO のデータベースに個人のアカウント情報を登録しなければなりません。個人と設定した場合は、シングルサインオンといいつつ、最低1回はユーザー名とパスワードを聞かれることになります。

では、それはどのように行うのでしょうか。

SharePoint 3.0 サーバーのヒントは SharePoint Designer 2007 にありました。ためしにSharePoint Designer 2007 のデータビューでバックエンドのデータベースのデータを取得するようにしてみたときに、一対一マッピング(個人) 設定のされている SSO認証を指定しました。すると、次のようなページにリダイレクトされます。

Sso2

このときに利用される URL は次の通りです。

つまり、一対一マッピングの SSO認証を使う場合は、このアドレスになんらかの運用ルールを決めて一度アクセスさせてユーザーに自分のアカウントを登録させる必要があります。

SharePoint Designer 2007 データビューの場合は、ユーザーに対して上記 URL へのリンクが自動的に生成されますが、Excel Services などではこうしたリンクは自動生成されることはないようです。

*************************************************************

[図. SharePoint Designer 2007 データビューの場合]

Sso5

※ 最初にデータビューではなく "認証するには、ここをクリックしてください"というリンクが表示される

Sso6

Sso7

※認証が終わるとデータが表示されるようになる

*************************************************************

ちなみに登録されたアカウントはSQL Server 上の SSO データベース内の "dbo.SSO_Credential"テーブルに格納されるようです。
Sso3

一旦登録されたアカウントを削除するには

ユーザーが個々に登録したアカウントを管理者が削除する必要がある場合は、「SharePoint 3.0 サーバーの全体管理」の「サーバー構成の管理」- 「シングル サインオン の管理」- 「企業アプリケーション定義のアカウント情報の管理」で削除したいアカウントを指定し、次の「企業アプリケーション定義」から適切な項目を選択します。

  • このアカウントの資格情報を、この企業アプリケーション定義から削除する
  • このアカウントの資格情報を、すべての企業アプリケーション定義から削除する

最後に [設定]ボタンをクリックします。

以上が、いろいろと試行錯誤の末にわかったことのまとめです。参考になれば幸いです。

一対一のマッピング

続きを読む »
2008年3月28日 (金)

シングルサインオンの概要

MOSS にはシングル サインオン の機能があります。Excel Services や SharePoint Designer 2007 のデータビューを使用したり、あるいは カスタムの Web パーツを作成してクライアント→ MOSS → バックエンドシステムとアクセスする際に、ダブルホップの問題が起こることがあります。そうした問題の克服に有用なのがシングルサインオンです。ダブルホップの問題とは、たとえば MOSS をNTLM 認証で構成している場合はプロトコルの仕様上、認証情報を転送することができないため、クライアント→MOSS まではアクセスできても、そこから先にあるデータベースシステムなどへは認証が通らずアクセスできないというものです。

つまり、ダブルホップの問題の克服方法には主に次の 2つの方法があることになります。

  • MOSS 上で Kerberos 認証を構成し、アカウントの委任ができるようにする
  • シングル サインオンを使用する

シングル サインオンは Kerberos 認証および NTLM 認証のどちらのプロトコルを使用していても利用できます。このうち Kerberos 認証はあくまで Active Directory ドメイン内での利用に限定されるため、Active Directory ドメイン以外のシステムからアクセスしたいような要件では特に 「NTLM 認証+シングルサインオン」という組み合わせが必要となることがあります。

MOSS はシングルサインオン用のデータベースを構築でき、そこにアカウントのマッピング情報を格納します(シングル サインオンの設定方法の詳細については、「ひと目でわかる~」の書籍や「SharePoint Server オフィシャルマニュアル」等に記載されていますのでそれらを参考にしてください)。

マッピング情報は"クライアント→ MOSS へアクセス" する Windows ユーザーと"MOSS→外部システムへアクセス"するアカウントを関連付けたものです。シングルサインオンでは、これを「多対一」あるいは「一対一」でマッピングできます。多対一では、特定のWindows グループアカウントに所属するユーザーをバックエンドで認証できる特定のアカウントに変換してからアクセスすることになります。一対一では、個々のWindows ユーザー情報をそのままバックエンドシステムに渡せるようになります。

本題

さて、前置きが長かったのですがここからが本題です。

実はWeb 上含め、さまざまなドキュメントには多対一のマッピングの設定方法は記載されているのですが、一対一のマッピングについての記載がほとんどありません(私が探せていないだけかもしれませんが、、、)。ちょうど先日受講者の方にご質問いただきまして、自分でも実は詳細を確認をしていなかったので好機と思い検証してみました。すると案外わかりにくい構成となっていることがわかりましたので、検証結果をご紹介したいと思います。

また若干長くなりそうなので、記事を分割して詳細は次回の投稿で説明します。

続きを読む »
2008年3月26日 (水)

前回の投稿では、SharePoint Designer 2007 を使用してカスタム作成ページにSharePoint の 日付選択コントロールを追加して利用する例をご紹介しました。

しかし、この日付選択コントロールは既定では SharePoint のスタイルが適用されずレイアウトが崩れてしまいます。

この場合の解決方法は次の通りです。

  1. SharePoint ハイブ(%programfiles%\common files\microsoft shared\web server extensions\12\)内のtemplates\layoutsにある "iframe.aspx" をメモ帳などで開く
  2. <Head>タグの直後に次のタグを追加する。
    <link rel="stylesheet" type="text/css"href="/_layouts/1041/styles/datepicker.css"/>
    ※ 2008.3.28 修正しました。ディレクトリ指定をうっかり "1033" と記載しておりました。 "1041" の間違いでした。

以上、Tips でした。


【参考】
http://blog.richfinn.net/2006/12/10/SharePointDateTimeControlDoesNotRenderStyles.aspx

2008年3月24日 (月)

ドキュメント ライブラリなどのファイルにメタデータ(プロパティ)を持たせることができるのは周知のことと思います。

たとえば、契約書などを保存する際に契約満了日などのプロパティを持たせておくと管理がしやすそうです。しかし、折角こうしたプロパティを持たせたのであれば、ユーザーが自由に期間を指定して特定のファイルだけを表示させたいところです。

さて、このようなフィルタを比較的手軽に行うにはどうしたらいいかが問題です。カスタムビューでのフィルタでは固定値になります。そんなときにうってつけなのがこちらのブログで何度もご紹介している "データビュー" です。 SharePoint Designer 2007 を使用すると既定のリストビューを データビューに変更できます。データビューに変換すると、フィルタが設定できるようになりますが、このフィルタに "クエリ文字列" が利用できます。

そこで次のようなソリューションを考えました。既定のリストビューをデータビューに変換し、クエリ文字列で期間を指定できるようにする。これで決まりです! あとはコントロールなどを配置してうまいこと JavaScript を組み込んでやればかなり使い勝手がよくなります。

次の図は 日付コントロールなどを挿入してスタイルシートを適用して見栄えを整えてWeb パーツでも挿入したような見た目にしていますが、実際には JavaScript のコードしか書いていません。

[図.期間指定でフィルタを設定する]
Dataviewadvancedfilter
Dataviewadvancedfilter2

作業概要

  • データビューに変換しフィルタを設定する
  • クエリ文字列を渡すためのコントロールやスクリプトを用意する

用意したライブラリ

ドキュメントライブラリを用意し、そこに "契約満了日" というプロパティを持たせています。

データビューに変換しフィルタを設定する

データビューの変更方法は既出の記事でご紹介していますので、詳しくは以下を参考にしてください。

  1. リストの view.aspx 内のリストビューを XSLT データビューに変換します。
  2. データビューの部分を右クリックし "コモン コントロール タスクの表示" をクリックします。
  3. "フィルタ" をクリックします。
  4. フィルタ条件として、フィールド名: "契約満了日" 、条件式: "次の値以上" 、値: "新しいパラメータの作成" を指定します。
  5. パラメータの作成画面で、パラメータ ソース: "クエリ文字列"、クエリ文字列変数: start というエントリを作成します。同様に、パラメータ ソース: "クエリ文字列"、クエリ文字列変数: end というエントリを作成します。
    Dataviewfilterquerystring1
  6. [OK] をクリックします。
  7. 一つ目の条件の値が "[start]" になっていることを確認します。
  8. 再びフィルタ条件として、フィールド名: "契約満了日" 、条件式: "次の値以下" 、値: "[end]" を追加します。

    Dataviewfilterquerystring2

  9. [OK] をクリックします。

※ソースコードを確認するとわかりますが、フィルタを設定すると、DataSource 内の select 属性にフィルタ内容が CAML として生成されます。CAMLは SharePoint 用のクエリ言語のようなものです。ここに書かれている条件を元にデータを取得してきます。

以上で 「リストのURL/view.aspx?start=開始日&end=終了日」と指定することで、フィルタが適用できるようになります。

クエリ文字列を渡すためのコントロールやスクリプトを用意する

データビューコントロールのタグの直前に次のようなコードを挿入します。今回は日付をコントロールを利用して指定できるよう、SharePointDateTimeControl を挿入しています。

+++++++++++++++++++++++

<asp:Content ContentPlaceHolderId="PlaceHolderMain" runat="server">
<!-- 以下にコードを追加-->
<br/><p></p>
<table style="font-family:'MS UI Gothic'" class="ms-quickLaunch" align="center">
<tr class="ms-quicklaunchheader"><td colspan="5" align="left">契約満了日でフィルタする</td></tr>
<tr>
<td>
<SharePoint:DateTimeControl runat=server id="DateTimeControl_Start"
DateOnly="true" ToolTip="検索を開始する日付"/>
</td>
<td>から</td>
<td>
<SharePoint:DateTimeControl runat=server id="DateTimeControl_End"
DateOnly="true"  EnableViewState="true"/>

</td><td>まで</td><td>

<input type="button" value="フィルタの実行" onclick="return goFilter()" style="background-color:#FFCC00" name="filterButton"/>
</td></tr>
<tr><td colspan="4" style="color:red;font-size:x-small" id="kikan"></td></tr></table>
<p></p>

<!-- ここまで -->
  <WebPartPages:WebPartZone runat="server" FrameType="None" ID="Main" Title="loc:Main">

++++++++++++++++++++++++++++++

あとはスクリプトを組み込むだけです。日付データであることの妥当性検証などは省いていますが、たとえば以下のようなスクリプトを上記に追加してやればよいです。

+++++++++++++++++++++++++++++

<script type="text/javascript">
<!--

//クエリ文字列を取得し、設定した期間を画面上に表示する
_spBodyOnLoadFunctionNames.push("getFilterCondition");

function getFilterCondition(){
var startDate,endDate;
var message;
var values = getQueryString();
if((values["start"]!= null)&&(values["end"]!=null))
{
  startDate=values["start"];
  endDate=values["end"];
  message= startDate + " から " + endDate  + " までの期間でフィルタしています";
}else{
  message="フィルタの条件が指定されていません。条件を指定してください。";
}
document.getElementById("kikan").innerText=message;
}

//クエリ文字列を取得する
function getQueryString(){
var qs = location.search.substring(1, location.search.length);   
var args = qs.split("&");
var vals = new Object();

for (var i=0; i < args.length; i++) {
     var nameVal = args[i].split("=");
  var temp = unescape(nameVal[1]).split('+');
  nameVal[1] = temp.join(' ');
  vals[nameVal[0]] = nameVal[1];

return vals;
}

//ユーザーが指定した範囲をクエリ文字列として渡す
function goFilter()
{
var startDateTag,endDateTag;
var startDate=new Date();
var endDate=new Date();

//SharePointDateTimeControl のオブジェクトを取得
startDateTag=document.getElementById("ctl00$PlaceHolderMain$DateTimeControl_Start$DateTimeControl_StartDate");
endDateTag=document.getElementById("ctl00$PlaceHolderMain$DateTimeControl_End$DateTimeControl_EndDate");

if(startDateTag.value=="")
{
alert('フィルタで使用する開始日を指定してください');
return;
}

if(endDateTag.value=="")
{
alert('フィルタで使用する終了日を指定してください');
return;
}

startDate=startDateTag.value;
endDate=endDateTag.value;

if(startDate>endDate)
{
alert('日付の指定が不正です。正しい範囲を指定してください');
return;
}

startDate=replaceDate(startDate);
endDate=replaceDate(endDate);

window.location="view.aspx?start="+startDate + "&end=" + endDate;
}

//日付は "yyyy-mm-dd" 形式で渡す必要がある
function replaceDate(str)
{
while(str.indexOf("/",0)!=-1)
{
  str=str.replace("/","-");
}
return str;
}
//-->
</script>
+++++++++++++++++++++++++++++++++

以上、SharePoint Designer 2007 のみでのカスタマイズでも、以外にここまでできると便利だなぁと改めて実感した次第です。

実は今回使用した日付コントロールですが、そのまま使用するとカレンダー表示時のレイアウトが崩れます。次回は、その修正方法をご紹介します。


【参考】
Microsoft SharePoint Designer Team Blog (英語)

続きを読む »
2008年3月21日 (金)

サイドリンクバーにはツリービューを表示することが可能ですが、既定ではアクセス許可があたえられている限りすべてのサブサイトやリスト、ライブラリが表示されます。

[図.既定のツリービュー表示]
Defaulttreeview

大変便利な機能ですが、全てを表示させたくないことも多いのではないでしょうか。しかし、Web ブラウザ上からはツリービューの表示は変更できません。そこで、ちょっとしたカスタマイズ方法をご紹介します。

ツリービューの表示は、SharePoint Designer 2007 を使用してマスタページを編集することで、サブサイトは非表示にするなどのカスタマイズが可能です。

ツリービューは、ASP.NET 2.0 にあるツリービューコントロールを継承したSharePoint 用のコントロールであり、表示内容はデータソース コントロールから取得しています。そのため、このデータソース コントロールのプロパティを編集すればカスタマイズができるという訳です(このデータソースも ASP.NET 2.0 のものを継承した SharePoint 用のコントロールになっています)。

[図.カスタマイズ後のツリービュー]

Customtreeview

マスタページの編集

  1. default.master をコピーし、任意の名前で同じくマスタページギャラリー内に保存します。たとえば、 "myDefault.master" という名前で保存します。
  2. コードビューに切り替え、"SharePoint:SPHierarchyDataSourceControl" タグを見つけます。
  3. 「IncludeDiscussionFolders="true"」の後に、次の図のようにプロパティを追加します。今回はドキュメントライブラリと関連するフォルダの表示のみに限定するようにカスタマイズしています。
    Treeviewdatasourcemodified
  4. マイナーバージョンもしくはメジャーバージョンとして上書き保存します。

以上の設定が終わったら、マスタページを新しいものに変更すれば OK です。

構成可能な主なプロパティ

構成可能な主なプロパティは次の通りです。既定ではすべて "true" となっているようです。

  • IncludeDiscussionFolders … ディスカッション掲示板内の投稿をフォルダとして表示する
  • ShowDocLibChildren … ドキュメント ライブラリを表示する
  • ShowFolderChildren … フォルダを表示する
  • ShowListChildren … リストを表示する
  • ShowWebChildren … サブサイトを表示する

いくつか実験してみたところ、ディスカッション掲示板の扱いには注意がいりそうです。ディスカッション掲示板を表示する場合は、ShowListChildren を true にする必要があります。ディスカッション掲示板内の投稿を表示するには、ShowFolderChildren と IncludeDiscussionFolders の両方が true になっている必要があります。


【参考】
Sharepoint Tips And Tricks (英語)