- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我们使用 SharePoint 客户端对象模型为 SharePoint online 构建 Windows 客户端应用程序。我们想使用OAuth 来对这个Windows 客户端应用程序进行身份验证,但是我们没有找到实现它的方法;并且 MSDN 上的文档含糊不清。
这article然而,举了一个例子,当我使用链接创建新应用程序时 https://<TENANT>.sharepoint.com/_layouts/appregnew.aspx
,“在客户端计算机上运行的应用程序”选项被禁用,SharePoint 在线网站中是否有启用此设置的设置?
最佳答案
经过多次尝试,我成功了
我想这不是最精彩的代码,但它是:
/// <summary>
/// Sets needed values
/// </summary>
/// <param name="clientId">The ClientId from the application</param>
/// <param name="redirectUri">The RedirectUri where the browser has to be send.</param>
/// <param name="resource">The source you want to access</param>
public OneDriveConnection(string clientId, string clientSecret, string redirectUri, string resource)
{
this._clientId = clientId;
this._redirectUri = Uri.EscapeDataString(redirectUri);
this._resource = Uri.EscapeDataString(resource);
this._clientSecret = clientSecret;
}
接下来我创建一个浏览器,提示用户登录:
/// <summary>
/// Authorizes the application
/// </summary>
public void Authorize()
{
/* EXAMPLE: GET https://login.windows.net/common/oauth2/authorize
* ?response_type=code
* &client_id=acb81092-056e-41d6-a553-36c5bd1d4a72
* &redirect_uri=https://mycoolwebapp.azurewebsites.net
* &resource=https:%2f%2foutlook.office365.com%2f
* &state=5fdfd60b-8457-4536-b20f-fcb658d19458 */
string baseUri = "https://login.windows.net/common/oauth2/authorize";
string authorizationUri = string.Format(baseUri
+ "?response_type=code"
+ "&client_id={0}"
+ "&redirect_uri={1}"
+ "&resource={2}"
+ "&state={3}", this._clientId, this._redirectUri, this._resource, "5fdfd60b-8457-4536-b20f-fcb658d19458");
// Create the form
Form webBrowserForm = new Form();
webBrowserForm.MaximizeBox = false;
webBrowserForm.MinimizeBox = false;
webBrowserForm.Size = new System.Drawing.Size(580, 890);
webBrowserForm.Text = "Webbrowser";
webBrowserForm.FormBorderStyle = FormBorderStyle.FixedDialog;
webBrowserForm.StartPosition = FormStartPosition.CenterScreen;
// Create the WebBrowser
WebBrowser webBrowser = new WebBrowser();
webBrowser.Width = 580;
webBrowser.Height = 890;
webBrowser.Location = new System.Drawing.Point(0, 0);
webBrowser.ShowPageSetupDialog();
// Hook event to the webBrowser
webBrowser.Navigated += webBrowser_Navigated;
// Show the webBrowser and form to the user
webBrowserForm.Controls.Add(webBrowser);
webBrowserForm.Show();
// Navigate to the authorizationUri
webBrowser.Navigate(authorizationUri);
}
这里我检查是否有执行GetTokenInformation方法的代码:
/// <summary>
/// When the url has code in it and contains a session_state get the code and do the GetTokenInformation
/// </summary>
private void webBrowser_Navigated(object sender, WebBrowserNavigatedEventArgs e)
{
if (e.Url.AbsoluteUri.Contains("code=") && e.Url.AbsoluteUri.Contains("session_state"))
{
string[] splited = e.Url.AbsoluteUri.Split(new char[] { '=', '&' });
_code = splited[1];
if (!string.IsNullOrWhiteSpace(_code)
&& !string.IsNullOrWhiteSpace(_redirectUri)
&& !string.IsNullOrWhiteSpace(_clientId))
{
GetTokenInformation(_code, _redirectUri, _clientId, _clientSecret);
}
else
{
_connected = false;
}
}
}
在 GetTokenInformation 方法中,我获取 TokenInformation,我使用 Newtonsoft.Json dll 将其放入 TokenInformation 类中
/// <summary>
/// This method gets tokeninformation: access_token, token_type, expires_in, resource, refresh_token, scope, id_token
/// </summary>
/// <param name="code">Code from the authorize request</param>
/// <param name="redirectUri">Reply url for your application</param>
/// <param name="clientId">Your applications client id in Windows Azure Directory</param>
/// <param name="clientSecret">Your applications client secret</param>
private void GetTokenInformation(string code, string redirectUri, string clientId, string clientSecret)
{
// Get the token information that is set above in the constructor with the help of the clientId, clientSecret and code and as well as the redirectUri without it you can't connect to it otherwise it will crash if you don't do it like that
string baseUri = "https://login.windows.net/common/oauth2/token";
string parameters = string.Format("grant_type=authorization_code"
+ "&code={0}"
+ "&redirect_uri={1}"
+ "&client_id={2}"
+ "&client_secret={3}", code, redirectUri, clientId, clientSecret);
string response = HttpPost(baseUri, parameters);
if (!string.IsNullOrWhiteSpace(response))
{
_tokenInformation = JsonConvert.DeserializeObject<TokenInformation>(response);
_connected = true;
}
else
{
_connected = false;
}
}
这是我使用 Newtonsoft.Json dll 的 TokenInformation 类:
[JsonObject(MemberSerialization.OptIn)]
class TokenInformation
{
[JsonProperty(PropertyName = "access_token")]
public string AccessToken { get; set; }
[JsonProperty(PropertyName = "token_type")]
public string TokenType { get; set; }
[JsonProperty(PropertyName = "expires_in")]
public int ExpiresIn { get; set; }
[JsonProperty(PropertyName = "expires_on")]
public int ExpiresOn { get; set; }
[JsonProperty(PropertyName = "resource")]
public string Resource { get; set; }
[JsonProperty(PropertyName = "refresh_token")]
public string RefreshToken { get; set; }
[JsonProperty(PropertyName = "scope")]
public string Scope { get; set; }
[JsonProperty(PropertyName = "id_token")]
public string IdToken { get; set; }
}
这是我找到连接到 SharePoint/Office365 所需的请求的地方:link
关于c# - SharePoint 联机 : can a Windows Client application use OAuth for authentication?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19911521/
例如,我如何比较 Junit 中的动态对象类型:- while (objList.hasNext()) { Object obj = objList.next(); Asser
如何在方法本身内部测试参数。例如 class TestClass { public void paraMethod(String para1, String para2) { Str
我觉得问这个问题很愚蠢,因为在搜索了三个小时后,我不断得到我无法理解的答案。提醒我,我对网络编程还是很陌生。 我已经用 jsp 和一个 mysql 数据库编写了一个很酷的小应用程序,并且一直在本地(在
假设我有 var input = new int[] { 0, 1, 2, 3, 4, 5 }; 如何将它们分组成对? var output = new int[][] { new int[] { 0
我正在我的azure移动应用程序中尝试离线同步,但它总是返回空指针。我已经调试了3天以找到错误根源,但无法弄清楚。任何帮助将不胜感激。每次我调试我出现此错误,我已按照 Microsoft azre 提
我正在尝试使用 TrueForAll 方法,但效果不是很好。谁能帮帮我? 我的问题:我有一个整数列表,例如 myIntList。我需要满足列表中所有整数的特定条件。 例子: List myFinalL
我正在开发一个聊天机器人,使用 DialogFlow 作为我的自然语言处理程序,并使用 Python 作为我的客户端。 我的应用程序旨在与 python 环境中的人交谈(我目前正在使用 Jupyter
我已经尝试过 QuickBlox 文档方法,但上次请求时间始终不变,实际上,当连接的用户使用 Quickblox 进行任何事件(例如与某人聊天)时,它应该被更新。 但是,它保持不变。(它只给出用户登录
我在 SQLserver 中有一个名为 CandidateContacts 的表,它具有以下字段 Id、createDate、dateUpdated、address。 我正在尝试获取给定 ID 列表中
我们使用 SharePoint 客户端对象模型为 SharePoint online 构建 Windows 客户端应用程序。我们想使用OAuth 来对这个Windows 客户端应用程序进行身份验证,但
我是一名优秀的程序员,十分优秀!