首页 > 解决方案 > ASP.NET Core Web API 中的 Azure AD 仅应用身份验证

问题描述

我见过的大多数 ASP.NET Core WebAPI 示例都是利用身份验证“中间件”,它被添加到启动文件中,它似乎使代码非常优雅。但是,我没有以任何方式对用户进行身份验证,而是使用Azure AD App-Only来访问 Graph 和 SharePoint REST API。而且我找不到任何像样的例子来展示如何在不登录用户的情况下利用“中间件”。

我能找到的唯一例子就是这个,下面是我想出的。我的技术有效,但似乎有点新手,我想知道是否有办法让 App-Only 身份验证在本机核心身份验证/身份工具集中工作?

public class ExclusionRequestsController : Controller
{
    private readonly IConfiguration Config;
    private string token;
    public ExclusionRequestsController(IConfiguration config)
    {
        Config = config;
        this.Init();

    }
    private async void Init()
    {
        string certFile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, Directory.GetCurrentDirectory() + Config["BIS232AppSettings:CertificatePath"]);
        X509Certificate2 certificate = new X509Certificate2(certFile, Config["BIS232AppSettings:CertificatePassword"], X509KeyStorageFlags.MachineKeySet);
        AuthenticationContext authenticationContext = new AuthenticationContext(String.Format("{0}{1}/oauth2/authorize",
            Config["BIS232AppSettings:Instance"],
            Config["BIS232AppSettings:TenantID"]), false);
        ClientAssertionCertificate cac = new ClientAssertionCertificate(Config["BIS232AppSettings:ClientID"], certificate);
        var authenticationResult = await authenticationContext.AcquireTokenAsync(Config["BIS232AppSettings:GraphResourceId"], cac);
        this.token = authenticationResult.AccessToken;
    }

    // GET: api/ExclusionRequests/Get
    [HttpGet]
    [ActionName("Get")]
    public async Task<ActionResult<dynamic>> Get()
    {
        HttpClient client = new HttpClient();
        client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", this.token);
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        string requestUrl = Config["BIS232AppSettings:GraphResourceId"] + "v1.0/sites/" + Config["BIS232AppSettings:Hostname"] + ","
            + Config["BIS232AppSettings:SPSiteID"] + "," + Config["BIS232AppSettings:SPWebID"] + "/lists/"
            + Config["BIS232AppSettings:ERList"] + "/items?expand=Fields&$top=50";

        HttpResponseMessage result = await client.GetAsync(requestUrl);
        if (result.IsSuccessStatusCode)
        {
            string json = await result.Content.ReadAsStringAsync();
            return JsonConvert.DeserializeObject(json);
        }
        else
            return new NoContentResult();
    }
}

标签: c#asp.net-coreasp.net-core-webapiazure-ad-graph-api

解决方案


推荐阅读