Как мне защитить свои страницы, чтобы к ним могли получить доступ только те, кто прошел аутентификацию? - PullRequest
0 голосов
/ 31 октября 2018

Я установил форму аутентификации в своем веб-приложении, но все равно могу получить доступ ко всем остальным страницам. Как я могу запретить себе доступ к страницам, пока я не аутентифицируюсь?

Я создал интерфейс, чтобы я мог использовать метод входа в систему, который будет принимать имя пользователя и пароль и возвращать истину или ложь в случае успешного связывания.

Интерфейс

using System;
using HSLogApp.Classes;

namespace HSLogApp.Interfaces
{
    public interface IAuthService
    {
        bool Login(string username, string password);
    }
}

Я создал класс, который наследует интерфейс. Соединения выполняются в конструкторе, а метод Login используется для получения имени пользователя и пароля.

Класс аутентификации

using System;
using System.Linq;
using HSLogApp.Interfaces;
using Microsoft.Extensions.Options;
using Novell.Directory.Ldap;

namespace HSLogApp.Classes
{
    class LdapAuthenticationService : IAuthService
    {
        private const string MemberOfAttribute = "memberOf";
        private const string DisplayNameAttribute = "displayName";
        private const string SAMAccountNameAttribute = "sAMAccountName";

        private readonly LdapConfig _config;
        private readonly LdapConnection connection;

        public LdapAuthenticationService(IOptions<LdapConfig> config)
        {
            _config = config.Value;
            connection = new LdapConnection
            {
                SecureSocketLayer = true
            };

            try
            {
                connection.Connect(_config.Url, _config.Port);
                // _connection.Bind(username, password);

            }
            catch (LdapException lex)
            {
                Console.WriteLine("CONNECTION ERROR");
                Console.WriteLine("DETAILS - " + lex.ToString());
            }
        }

        public bool Login(string Username, string Password)
        {
            try
            {
                connection.Bind(Username, Password);
            }
            catch
            {
                return false;
            }

            return true;
        }

    }
}

EDIT Вид:

@page
@model IndexModel
@{
    ViewData["Title"] = "Login";
}

<div class="box-header">
    <h2>Log In</h2>
</div>
<form method="post">
    <div asp-validation-summary="ModelOnly" class="text-danger"></div>
    <label for="username">Username</label>
    <br />
    <input type="email" id="Username" asp-for="Username" class="form-control">
    <br />
    <label for="password">Password</label>
    <br />
    <input type="password" id="Password" asp-for="Password" class="form-control">
    <br />
    <button type="submit">Sign In</button>
    <br />
</form>
<a href="#"><p class="small">Forgot your password?</p></a>

<br>
@if(User.Identity.IsAuthenticated)
{
    <p class="alert alert-success">
        You are successfully authenticated.
    </p>
}

Просмотреть код позади Показываю, как я проверяю аутентификацию.

public async Task<ActionResult> OnPostAsync(string returnUrl = null)
        {
            bool user = _authService.Login(Username, Password);
            if (user)
            {
                Result = true;

                var claims = new List<Claim>
                {
                    new Claim(ClaimTypes.NameIdentifier, Username)
                };

                var claimsIdentity = new ClaimsIdentity(
                    claims, CookieAuthenticationDefaults.AuthenticationScheme);

                var authProperties = new AuthenticationProperties { IsPersistent = true };

                await HttpContext.SignInAsync(
                    CookieAuthenticationDefaults.AuthenticationScheme,
                    new ClaimsPrincipal(claimsIdentity),
                    authProperties);

                    return RedirectToPage("/hslogs/index");
            }
            else
            {
                Result = false;
                return RedirectToPage();
            }
        }

Надеюсь, это все, что вам нужно. Дайте мне знать, если мне нужно будет опубликовать больше кода / информации, чтобы вы могли понять мою ситуацию.

1 Ответ

0 голосов
/ 06 ноября 2018

Я добавил [Authorize] в верхнюю часть контроллера под пространством имен прямо над public class IndexModel: PageModel.

Это выглядит так:

[Authorize]
public class IndexModel: PageModel
{
    ...
{
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...