来自 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;
        }
    }