0

アイテムを SharePoint リストに挿入する (私が書いていない) コードを修正しようとしています。問題は、コードが匿名ユーザーに対して機能することですが、ユーザーが ASP.NET フォーム認証を介してログインしている場合、SPListItem の Update メソッドを呼び出すと UnauthorizedAccessException が発生します。匿名ユーザーとして機能すると、SPListItem の SPWeb の SPUser が SharePoint システム アカウントであることがわかります。ただし、ユーザーがフォーム認証でログインしている場合、SPUser は null です。誰かがこの動作とそれを修正する方法を説明できますか?

RunWithElevatedPrivileges デリゲートには、最初のコード ブロックのみが含まれていましたが、すべて内部に移動してみました。動作するようになったら、いくつかの using ブロックを挿入します。

SPSecurity.RunWithElevatedPrivileges(delegate()
        {
            rootWeb = SPContext.Current.Site.RootWeb;
            rootWeb.AllowUnsafeUpdates = true;
            currentWeb = SPContext.Current.Web;
            currentWeb.AllowUnsafeUpdates = true;

        try
        {
            // Get site information
            SPList franDir = rootWeb.GetList("/Lists/Directory");
            SPQuery query = new SPQuery();
            query.Query = "<Where><Eq><FieldRef Name='Subsite'/><Value Type='Text'>" + currentWeb.Name +
                 "</Value></Eq></Where>";

            SPListItemCollection items = franDir.GetItems(query);

            SPList l = rootWeb.GetList("/Lists/Request");

            SPListItem li = l.Items.Add();
            li["Location"] = siteName;
            //...set more fields


            li.Update();

        }
        catch (Exception ex)
        {
            rootWeb.Dispose();
            logger.ErrorException("An error occured adding item", ex);
            throw ex;
        }

        rootWeb.Dispose();
        });
4

1 に答える 1

0

@AlexeiLevenkovのおかげで、デフォルトの権限を使用して作成されたSPオブジェクトの既存のインスタンスを使用しているため、これが機能しないことがわかります。コードが何もしないことの証拠として、匿名ユーザーとして実行すると、RunWithElevatedPrivileges呼び出しがなくてもコードは成功します。私はこの変更を行い、それを処理しました。

SPSecurity.RunWithElevatedPrivileges(delegate()
{
     rootWeb = new SPSite(SPContext.Current.Site.ID).RootWeb;

どうもありがとう!

于 2012-10-08T22:41:38.443 に答える