ASP.NET Core 2.2 Авторизация не авторизуется - PullRequest
1 голос
/ 12 июня 2019

Я работаю над простым примером авторизации, используя утверждения, и авторизация не предоставляется.

Просто для ясности, я использую ASP.NET Core 2.2.4

Файл startup.cs настроен следующим образом:

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();
    ...
    services.AddIdentity<IdentityUser, IdentityRole>(option => { option.Password = new PasswordOptions { ... }; };
    services.ConfigureApplicationCookie(option => { option.LoginPath = "/logins/Index"; });

    services.AddAuthorization(option => 
    {
        option.AddPolicy("EditorOver18Policy", policy =>
        {
            policy.RequireClaim("Over18Claim");
        });
    });
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseAuthentication();
    app.UseMvc(routes =>
        { ... });
}

Во время входа в систему создаются утверждения:

[HttpPost]
public async Task<IActionResult> Login(LoginViewModel model)
{
    if (!ModelState.IsValid)
    { ... }

    var result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, false);

    if (!result.Succeeded)
    { ... }

    var claims = new List<Claim>();
    claims.Add(new Claim("Over18Claim", "True"));

    var claimIdentity = new ClaimsIdentity(claims);

    User.AddIdentity(claimIdentity);

    if (!string.IsNullOrEmpty(model.ReturnUrl))
        return Redirect(model.ReturnUrl);

    return RedirectToAction("Display", "Photos");
}

Контроллер, который должен быть защищен:

[Authorize (policy: "EditorOver18Policy")]
public IActionResult Upload()
{
    ...
}

Проще говоря, при запуске, убедитесь, что я только что вошел в систему и, таким образом, получил претензию, я получаю ошибку об отказе в доступе (извините, если она на португальском языке):

enter image description here

Чего мне не хватает?

1 Ответ

1 голос
/ 13 июня 2019

Чтобы добавить пользовательские утверждения, вы можете реализовать пользовательский IUserClaimsPrincipalFactory или использовать UserClaimsPrincipalFactory в качестве базового класса:

public class ApplicationClaimsIdentityFactory : Microsoft.AspNetCore.Identity.UserClaimsPrincipalFactory<IdentityUser>
{
    UserManager<IdentityUser> _userManager;
    public ApplicationClaimsIdentityFactory(UserManager<IdentityUser> userManager,
        IOptions<IdentityOptions> optionsAccessor) : base(userManager, optionsAccessor)
    { }
    public async override Task<ClaimsPrincipal> CreateAsync(IdentityUser user)
    {
        var principal = await base.CreateAsync(user);

            ((ClaimsIdentity)principal.Identity).AddClaims(new[] {
            new Claim("Over18Claim", "true")
        });

        return principal;
    }
}

Затем зарегистрируйте это в ConfigureServices функции Startup.cs:

services.AddScoped<IUserClaimsPrincipalFactory<IdentityUser>, ApplicationClaimsIdentityFactory>();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...