来自 Azure 活动目录的 C# CSOM Sharepoint Bearer 请求
C# CSOM Sharepoint Bearer request from azure active directory
我使用以下方法作为基础 (https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-devquickstarts-webapi-dotnet)。
我在设置 azure 后让所有这个例子都起作用了。但现在我们需要将其移植到实际现有的移动应用程序和 Web api 应用程序。移动应用程序可以获得 Bearer 令牌,但是当我们将其传递到 Web api 时,我们将其传递到 CSOM 请求中如下,但我们仍然得到 401 Unauthroised 响应。
public static ClientContext GetSharepointBearerClientContext(this JwtTokenDetails tokenDetails)
{
var context = new ClientContext(tokenDetails.SiteUrl);
//context.AuthenticationMode = ClientAuthenticationMode.Anonymous;
context.ExecutingWebRequest += new EventHandler<WebRequestEventArgs>((s, e) =>
{
e.WebRequestExecutor.RequestHeaders["Authorization"] = "Bearer " + tokenDetails.BearerToken;
});
return context;
}
我们的网站 api 没有使用上述示例中的任何技术,因为我认为我们应该能够通过 header 中的 CSOM 请求传递令牌,但这不起作用,我还能看什么?
我已分配 Office 365 Sharepoint Online (Microsoft.Sharepoint) 权限并设置以下内容
我也为应用程序注册做了同样的事情,我们并没有真正使用它!仍然不确定应用程序注册是如何进入的)...
所以这是可能的,只是微软告诉我们输入了错误的值。所有文档都说将 APP ID URI 放入资源中。但在我们的例子中,它需要是共享点 url.
所以我们有租户名称,在 azure id 上有域名,例如srmukdev.onmicrosoft.com
租户:srmukdev.onmicrosoft.com
应用程序 ID:这是在 Azure 活动目录中注册的应用程序的 GUID。
RedirectUri:这可以是任何 url(URI),据我所知,它实际上并未用作移动应用程序的 url看。
ResourceUrl: srmukdev.sharepoint.com
对于 WPF 示例,我用来获取令牌的代码如下所示。 aadInstance 是 https://login.microsoftonline.com/{0}
private static string authority = String.Format(CultureInfo.InvariantCulture, aadInstance, tenant);
public async void CheckForCachedToken(PromptBehavior propmptBehavior)
{
//
// As the application starts, try to get an access token without prompting the user. If one exists, populate the To Do list. If not, continue.
//
AuthenticationResult result = null;
try
{
result = await authContext.AcquireTokenAsync(resourceUrl, applicationId, redirectUri, new PlatformParameters(propmptBehavior));
TokenTextBox.Text = result.AccessToken;
// A valid token is in the cache - get the To Do list.
GetTokenButton.Content = "Clear Cache";
}
catch (AdalException ex)
{
if (ex.ErrorCode == "user_interaction_required")
{
// There are no tokens in the cache. Proceed without calling the To Do list service.
}
else
{
// An unexpected error occurred.
string message = ex.Message;
if (ex.InnerException != null)
{
message += "Inner Exception : " + ex.InnerException.Message;
}
MessageBox.Show(message);
}
return;
}
}
我使用以下方法作为基础 (https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-devquickstarts-webapi-dotnet)。
我在设置 azure 后让所有这个例子都起作用了。但现在我们需要将其移植到实际现有的移动应用程序和 Web api 应用程序。移动应用程序可以获得 Bearer 令牌,但是当我们将其传递到 Web api 时,我们将其传递到 CSOM 请求中如下,但我们仍然得到 401 Unauthroised 响应。
public static ClientContext GetSharepointBearerClientContext(this JwtTokenDetails tokenDetails)
{
var context = new ClientContext(tokenDetails.SiteUrl);
//context.AuthenticationMode = ClientAuthenticationMode.Anonymous;
context.ExecutingWebRequest += new EventHandler<WebRequestEventArgs>((s, e) =>
{
e.WebRequestExecutor.RequestHeaders["Authorization"] = "Bearer " + tokenDetails.BearerToken;
});
return context;
}
我们的网站 api 没有使用上述示例中的任何技术,因为我认为我们应该能够通过 header 中的 CSOM 请求传递令牌,但这不起作用,我还能看什么?
我已分配 Office 365 Sharepoint Online (Microsoft.Sharepoint) 权限并设置以下内容
我也为应用程序注册做了同样的事情,我们并没有真正使用它!仍然不确定应用程序注册是如何进入的)...
所以这是可能的,只是微软告诉我们输入了错误的值。所有文档都说将 APP ID URI 放入资源中。但在我们的例子中,它需要是共享点 url.
所以我们有租户名称,在 azure id 上有域名,例如srmukdev.onmicrosoft.com
租户:srmukdev.onmicrosoft.com
应用程序 ID:这是在 Azure 活动目录中注册的应用程序的 GUID。
RedirectUri:这可以是任何 url(URI),据我所知,它实际上并未用作移动应用程序的 url看。
ResourceUrl: srmukdev.sharepoint.com
对于 WPF 示例,我用来获取令牌的代码如下所示。 aadInstance 是 https://login.microsoftonline.com/{0}
private static string authority = String.Format(CultureInfo.InvariantCulture, aadInstance, tenant);
public async void CheckForCachedToken(PromptBehavior propmptBehavior)
{
//
// As the application starts, try to get an access token without prompting the user. If one exists, populate the To Do list. If not, continue.
//
AuthenticationResult result = null;
try
{
result = await authContext.AcquireTokenAsync(resourceUrl, applicationId, redirectUri, new PlatformParameters(propmptBehavior));
TokenTextBox.Text = result.AccessToken;
// A valid token is in the cache - get the To Do list.
GetTokenButton.Content = "Clear Cache";
}
catch (AdalException ex)
{
if (ex.ErrorCode == "user_interaction_required")
{
// There are no tokens in the cache. Proceed without calling the To Do list service.
}
else
{
// An unexpected error occurred.
string message = ex.Message;
if (ex.InnerException != null)
{
message += "Inner Exception : " + ex.InnerException.Message;
}
MessageBox.Show(message);
}
return;
}
}