AspNetCore.Docs/aspnetcore/security/authorization/dependencyinjection.md

52 lines
2.0 KiB
Markdown
Raw Normal View History

2016-10-29 01:35:15 +08:00
---
2017-07-01 07:47:15 +08:00
title: Dependency Injection in requirement handlers
2016-10-29 01:35:15 +08:00
author: rick-anderson
description: This document outlines how to inject authorization requirement handlers into an ASP.NET Core app using dependency injection.
2016-10-29 01:35:15 +08:00
ms.author: riande
manager: wpickett
ms.date: 10/14/2016
ms.topic: article
2016-11-17 08:24:57 +08:00
ms.technology: aspnet
ms.prod: asp.net-core
2016-10-29 01:35:15 +08:00
uid: security/authorization/dependencyinjection
---
# Dependency Injection in requirement handlers
2017-10-14 04:50:30 +08:00
<a name="security-authorization-di"></a>
2016-10-29 01:35:15 +08:00
[Authorization handlers must be registered](policies.md#handler-registration) in the service collection during configuration (using [dependency injection](../../fundamentals/dependency-injection.md#fundamentals-dependency-injection)).
2016-10-29 01:35:15 +08:00
Suppose you had a repository of rules you wanted to evaluate inside an authorization handler and that repository was registered in the service collection. Authorization will resolve and inject that into your constructor.
2016-10-29 01:35:15 +08:00
2017-08-22 23:48:24 +08:00
For example, if you wanted to use ASP.NET's logging infrastructure you would want to inject `ILoggerFactory` into your handler. Such a handler might look like:
2016-10-29 01:35:15 +08:00
2016-11-18 13:03:07 +08:00
```csharp
2016-10-29 01:35:15 +08:00
public class LoggingAuthorizationHandler : AuthorizationHandler<MyRequirement>
{
ILogger _logger;
public LoggingAuthorizationHandler(ILoggerFactory loggerFactory)
{
_logger = loggerFactory.CreateLogger(this.GetType().FullName);
}
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, MyRequirement requirement)
{
_logger.LogInformation("Inside my handler");
// Check if the requirement is fulfilled.
return Task.CompletedTask;
}
}
2016-11-18 13:03:07 +08:00
```
2016-10-29 01:35:15 +08:00
You would register the handler with `services.AddSingleton()`:
2016-11-18 13:03:07 +08:00
```csharp
2016-10-29 01:35:15 +08:00
services.AddSingleton<IAuthorizationHandler, LoggingAuthorizationHandler>();
```
2016-10-29 01:35:15 +08:00
An instance of the handler will be created when your application starts, and DI will inject the registered `ILoggerFactory` into your constructor.
2016-10-29 01:35:15 +08:00
> [!NOTE]
> Handlers that use Entity Framework shouldn't be registered as singletons.