首页 文章

ASP.NET Core 2.1身份验证

提问于
浏览
2

我面临以下问题:我正在尝试使用基于角色的身份验证来保护我的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] 保护我的控制器 . 可以访问使用 [AllowAnonymous] 标记的API调用 .

但是,如何登录API并访问其他API调用?

为此,我创建了一个帐户控制器,如下所示:

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

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

我已经阅读了很多关于这个主题的文章,但我无法登录并运行 . 因此,目标是使用存储在用户管理器中的用户登录并访问需要身份验证的一些API调用 . 有人可以尝试解释我是如何实现它的吗?

1 回答

  • 1

    您需要使用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
            }
        }
    }
    

相关问题