【问题标题】:ASP.NET Core 2.1 authenticationASP.NET Core 2.1 身份验证
【发布时间】:2018-12-09 14:59:38
【问题描述】:

我面临以下问题:我正在尝试使用基于角色的身份验证来保护我的 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 调用。有人可以尝试解释我如何实现它吗?

【问题讨论】:

    标签: asp.net-core asp.net-core-2.1 role-base-authorization


    【解决方案1】:

    您需要使用SignInManager&lt;&gt;.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
            }
        }
    }
    

    【讨论】:

    • 非常感谢。这正是我一直在寻找的。我不知道有像 SignInManager 这样的东西。我已经更改了代码,一切正常。最后一个问题(有点题外话):我注意到如果我尝试访问需要身份验证的 API 调用而不进行身份验证,则会收到错误 404。是否可以将此状态代码更改为有意义的内容,例如默认401?
    • 我不确定为什么会发生这种情况。它可能与试图重定向未经授权的请求的 Identity 管理的 cookie 处理程序有关。试试看这个answer
    • 谢谢。我会看看这个链接。
    猜你喜欢
    • 1970-01-01
    • 2018-12-30
    • 1970-01-01
    • 2015-04-20
    • 2019-02-09
    • 2018-12-29
    • 2019-03-10
    • 2017-03-30
    • 2018-06-25
    相关资源
    最近更新 更多