Как зарегистрировать и использовать собственный обработчик события авторизации в Asp.Net Core?

Как можно перехватить событие авторизации пользователя и сохранить его имя и время входа в приложении Asp.Net Core, используя OpenID для авторизации?
  • 12 октября 2023 г. 15:39
Ответы на вопрос 3
Чтобы зарегистрировать и использовать собственный обработчик события авторизации в Asp.Net Core, вам необходимо выполнить следующие шаги:

1. Создайте класс собственного обработчика события авторизации, реализующего интерфейс `IAuthenticationHandler`. Например:

```csharp
public class CustomAuthenticationHandler : IAuthenticationHandler
{
    private HttpContext _context;

    public Task InitializeAsync(AuthenticationScheme scheme, HttpContext context)
    {
        _context = context;
        return Task.CompletedTask;
    }

    public Task<AuthenticateResult> AuthenticateAsync()
    {
        // Здесь может быть ваша логика проверки авторизации пользователя
        // Если пользователь авторизован успешно, создайте объект ClaimsPrincipal и установите его в HttpContext.User
        // Пример:
        var claims = new List<Claim>
        {
            new Claim(ClaimTypes.Name, "John")
        };
        var identity = new ClaimsIdentity(claims, "custom");
        var principal = new ClaimsPrincipal(identity);
        _context.User = principal;

        return Task.FromResult(AuthenticateResult.Success(new AuthenticationTicket(principal, "custom")));
    }

    public Task ChallengeAsync(AuthenticationProperties properties)
    {
        // Здесь может быть ваша логика перенаправления пользователя на страницу авторизации
        return Task.CompletedTask;
    }

    public Task ForbidAsync(AuthenticationProperties properties)
    {
        // Здесь может быть ваша логика перенаправления пользователя на страницу запрета доступа
        return Task.CompletedTask;
    }
}
```

2. Зарегистрируйте свой обработчик события авторизации в методе `ConfigureServices` класса `Startup`:

```csharp
services.AddAuthentication()
    .AddScheme<AuthenticationSchemeOptions, CustomAuthenticationHandler>("custom", options => { });
```

3. В методе `Configure` класса `Startup` добавьте вызов `UseAuthentication`, чтобы активировать авторизацию:

```csharp
app.UseAuthentication();
```

4. В вашем контроллере или другом сервисе вы можете получить информацию о текущем пользователе, сохранить ее и использовать по своему усмотрению. Например:

```csharp
[Authorize]
public class HomeController : Controller
{
    private readonly ILogger<HomeController> _logger;

    public HomeController(ILogger<HomeController> logger)
    {
        _logger = logger;
    }

    public IActionResult Index()
    {
        var userName = User.Identity.Name;
        var loginTime = DateTime.Now;

        // Здесь может быть ваша логика сохранения имени пользователя и времени входа
        // ...

        return View();
    }
}
```

Обратите внимание, что в приведенном примере используется простое определение имени пользователя через утверждение `ClaimTypes.Name`. В реальном приложении с OpenID вы должны использовать соответствующие утверждения, возвращаемые поставщиком OpenID.
OpenID требует настройки Callback URL, куда OpenID сервер будет отправлять информацию о соединении. 
 Убедитесь, что у вас есть Callback URL для своего OpenID сервера, чтобы получать информацию о коннекте.
Похожие вопросы