ASP.NET Core 2.1 аутентификация - PullRequest
0 голосов
/ 09 декабря 2018

У меня возникла следующая проблема: я пытаюсь защитить свой ASP.NET Core Web API с помощью аутентификации на основе ролей.

Я добавил следующие строки в ConfigureServices():

// Authorization
services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
services.AddIdentity<ApplicationUser, IdentityRole>()
        .AddDefaultTokenProviders()
        .AddEntityFrameworkStores<ApplicationDbContext>();
services.ConfigureApplicationCookie(options =>
    {
        // Cookie settings
        options.Cookie.HttpOnly = true;
        options.ExpireTimeSpan = TimeSpan.FromMinutes(5);

        options.LoginPath = "/api/Account/Login";
        options.AccessDeniedPath = "/api/Account/AccessDenied";
        options.SlidingExpiration = true;
    });

И до Configure():

// Authorization
app.UseAuthentication();

using (var scope = app.ApplicationServices.CreateScope())
{
    CreateRoles(scope.ServiceProvider.GetService<RoleManager<IdentityRole>>()).Wait();
    CreateUsers(scope.ServiceProvider.GetService<UserManager<ApplicationUser>>()).Wait();
}

CreateRoles() и CreateUsers() работают нормально: эти методы создают некоторые роли и пользователя-администратора, сохраняют их в соответствующих таблицах SQL и вменеджер пользователей / ролей.

Теперь я могу защитить свои контроллеры с помощью [Authorize].Доступ к вызовам API, помеченным [AllowAnonymous], возможен.

Но как мне войти в API и получить доступ к другим вызовам API?

Для этого я создал учетную записьКонтроллер выглядит следующим образом:

[Route("/api/Account")]
public class AccountController : Controller
{
    public AccountController()
    {
    }

    [HttpPost]
    [Route("Login")]
    public async Task<IActionResult> Login()
    {
    }
}

Я прочитал много статей на эту тему, но не могу запустить и запустить логин.Таким образом, цель состоит в том, чтобы войти в систему с пользователем, хранящимся в диспетчере пользователей, и получить доступ к некоторым вызовам API, которые требуют аутентификации.Может кто-нибудь попытаться объяснить, как мне этого добиться?

1 Ответ

0 голосов
/ 09 декабря 2018

Вам необходимо использовать SignInManager<>.PasswordSignInAsync() для входа в систему.Он назначит необходимые файлы cookie для обработки аутентификации.Это может выглядеть так:

public class AccountController : Controller
{
    private readonly SignInManager<ApplicationUser> _signInManager;
    public AccountController(SignInManager<ApplicationUser> signInManager)
    {
        _signInManager = signInManager;
    }

    public async Task<IActionResult> Login(string login, string password)
    {
        var result = await _signInManager.PasswordSignInAsync(login, password, true, lockoutOnFailure: false);

        if (result.Succeeded)
        { 
            //process successful result
        }
        else
        {
            //process failed result
        }
    }
}
...