Мне нужно использовать два этапа в нескольких местах на моем веб-сайте .NET Core.Я решил реализовать интерфейс и поддерживающий класс в моем Startup.cs
, чтобы я мог использовать DI для вставки объекта в мой PageModel
на различных страницах Razor в моем проекте.
Startup.cs
services.AddSingleton<IAuthenticatedGraphClient, AuthenticatedGraphClient>();
Интерфейс:
public interface IAuthenticatedGraphClient
{
Task<GraphServiceClient> GetAuthenticatedGraphClientAsync(HttpContext httpContext);
}
Реализация класса:
public class AuthenticatedGraphClient : IAuthenticatedGraphClient
{
private ITokenAcquisition tokenAcquisition;
public AuthenticatedGraphClient(ITokenAcquisition tokenAcquisition)
{
this.tokenAcquisition = tokenAcquisition;
}
public async Task<GraphServiceClient> GetAuthenticatedGraphClientAsync(HttpContext httpContext)
{
var accessToken = await TokenAcquisition.GetAccessTokenOnBehalfOfUser(httpContext, new[] { ScopeConstants.ScopeUserRead });
return new GraphServiceClient(new DelegateAuthenticationProvider((requestMessage) => {
requestMessage
.Headers
.Authorization = new AuthenticationHeaderValue("bearer", accessToken);
return Task.FromResult(0);
}));
}
}
PageModel:
public class TestPageModel : PageModel
{
private IAuthenticatedGraphClient graphClient;
public TestPage(IAuthenticatedGraphClient graphClient)
{
this.graphClient = graphClient;
}
public async Task OnPostAsync()
{
var graphServiceClient = await graphClient.GetAuthenticatedGraphClientAsync(HttpContext);
//truncated for brevity...
}
}
Я думал, что должен предоставить HttpContext
из класса PageModel
в вызываемый метод, но я не совсем уверен, так как это дает мне ошибку:
Ссылка на объект требуется для нестатического поля, метода или свойства 'TokenAcquisition.GetAccessTokenOnBehalfOfUser (HttpContext, IEnumerable, string) '
Я также пытался:
var accessToken = await TokenAcquisition.GetAccessTokenOnBehalfOfUser(HttpContext, new[] { ScopeConstants.ScopeUserRead });
... однако это дает мне ошибку:
'HttpContext' - это тип, который недопустим в данном контексте
Если я добавлю GetAuthenticatedGraphClientAsync
как метод в тот же класс PageModel
, он будет работать без проблем иHttpContext
понятно.
Есть идеи?Есть ли лучший шаблон?