c# - 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();
}
}
解决方案
推荐阅读
- atom-editor - 无法加载 Atom-live-server
- node.js - 如何在 lex/azure 中创建一个在松弛线程中响应的机器人?
- filter - OData - 如何过滤子元素?
- c - 定义一个 C 函数,该函数采用一个二维数组,其中包含维度大小的变量
- python - 将估计器设置为中值的 Seaborn 条形图无法正确绘制误差线
- tensorflow - 不同的 TensorFlow 版本,用于本地运行 google Colaboratory 页面
- typescript - 如何声明大小为 N 的元组类型(用于向量类)?
- replace - 如何在特定位置改变一个单词的字母,并在替换新字母后获得所有可能的组合?
- javascript - 如何在 javasript 的函数中使用变量?
- keras - keras 和 scikit-learn 中 MLP 回归器的不同损失值和准确度