2

現在、SharePoint Authentication.asmx を使用して、C# アプリケーション内から認証セッションを作成しています。これはすべて期待どおりに機能しており、ファイルなどをアップロードできます

次を使用して、アプリケーション内に自分の sharepoint サイトへのリンクもあります。

Process.Start("**/documents/Forms/***"); //URL modified for StackOverflow

私が抱えている問題は、アプリケーションでボタンをクリックすると、ユーザーがブラウザからログインするように求められることです。ブラウザにはセッションがないため、これは理解できます。アプリ内のセッションをブラウザと共有する方法はありますか?

これは、認証に使用しているコードです。

    using (SPAuth.Authentication authSvc = new SPAuth.Authentication())
    {
        authSvc.Url = @"***/_vti_bin/Authentication.asmx"; //URL modified for StackOverflow
        authSvc.CookieContainer = new System.Net.CookieContainer();     

        //set the FBA login information
        SPAuth.LoginResult result = authSvc.Login(username, password);

        if (result.ErrorCode == SPAuth.LoginErrorCode.NoError)
        {
            try
            {
                ...
            }
            catch
            {
                ...
            }
        }
    }
4

1 に答える 1

0

メソッドに従ってブラウザオブジェクトを維持できる場合は、問題が解決する可能性があります。

public void AuthenticateInSharePoint(String url, String login, String password)
    {
        try
        {
            var uri = new Uri(url);
            var uriBuilder = new UriBuilder();
            uriBuilder.Scheme = uri.Scheme;
            uriBuilder.Port = uri.Port;
            uriBuilder.Host = uri.Host;
            uriBuilder.Path = "_forms/default.aspx";
            uriBuilder.Query = String.Format("ReturnUrl={0}", HttpUtility.UrlEncode(uri.LocalPath));

            var request = (HttpWebRequest)HttpWebRequest.Create(uriBuilder.ToString());
            request.ContentType = "application/x-www-form-urlencoded";
            request.AllowAutoRedirect = true;
            var response = (HttpWebResponse)request.GetResponse();

            using (var reader = new StreamReader(response.GetResponseStream()))
            {
                var html = reader.ReadToEnd();

                var doc = new HtmlDocument();
                doc.LoadHtml(html);

                foreach (var node in doc.DocumentNode.Descendants("script").ToList())
                    node.Remove();

                foreach (var node in doc.DocumentNode.Descendants("link").ToList())
                    node.Remove();

                var form = doc.DocumentNode.Descendants("form").FirstOrDefault();
                if (form != null)
                {
                    form.Attributes["action"].Value = uriBuilder.ToString();

                    var script = doc.CreateElement("script");
                    script.InnerHtml = String.Format(@"
                        var input = document.createElement('input');
                        input.setAttribute('type', 'hidden');
                        input.setAttribute('name', 'ctl00$PlaceHolderMain$signInControl$login');
                        input.value = 'Sign In';
                        document.forms[0].appendChild(input);

                        document.getElementById('ctl00_PlaceHolderMain_signInControl_UserName').value=""{0}""; 
                        document.getElementById('ctl00_PlaceHolderMain_signInControl_password').value=""{1}""; 
                        document.forms[0].submit();", login, password);

                    var body = doc.DocumentNode.Descendants("body").FirstOrDefault();
                    if (body != null)
                        body.AppendChild(script);
                }

                var builder = new StringBuilder();
                using (var writer = new StringWriter(builder))
                    doc.Save(writer);

                return Content(builder.ToString(), response.ContentType);
            }
        }
        catch (Exception e)
        {
            Log.Error(e, "Failed to authenticate user in SharePoint.");
        }

    }
于 2013-08-26T16:25:32.163 に答える