Добавление перенаправления сразу после входа в ASP.Net Core 2.1 с использованием Identity Core - PullRequest
0 голосов
/ 15 февраля 2019

Привет, ребята. Я пытаюсь добиться перенаправлений сразу после входа в приложение .Net Core 2.1 с использованием Identity Core.

Перенаправления зависят от ролей вошедшего в систему пользователя.

Iя получаю исключение Null Reference.

Я прочитал несколько вопросов о переполнении стека и Git Issues и понял, что это потому, что пользователь не сохраняется в базе данных сразу после входа в систему:

var result =await _signInManager.PasswordSignInAsync(Input.Email, Input.Password, Input.RememberMe, lockoutOnFailure: true).Result;

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

Метод-1:

string userRole =_signInManager.Context.User.FindFirst(ClaimTypes.Role).Value;

Метод-2:

Чтобы определить, существует ли пользовательв данной роли:

User.IsInRole("RoleName")

Метод-3:

_userManager.GetClaimsAsync(user)

Я получаю исключение Null reference во всех случаях;Я понимаю, что это из-за того, что запрос не был выполнен.

Однако я не понимаю, что происходит не так.

Нужно направление.

Спасибо:)

Это мой startup.cs:

 public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddDbContext<ApplicationDbContext>(options =>
                options.UseSqlServer(
                    Configuration.GetConnectionString("DefaultConnection")));

            services.AddIdentity<IdentityUser,IdentityRole>()
                .AddEntityFrameworkStores<ApplicationDbContext>();

            services.Configure<CookiePolicyOptions>(options =>
            {
                // This lambda determines whether user consent for non-essential cookies is needed for a given request.
                options.CheckConsentNeeded = context => true;
                options.MinimumSameSitePolicy = SameSiteMode.None;

            });

            services.ConfigureApplicationCookie(options =>
            {
                // Cookie settings  
                options.Cookie.HttpOnly = true;
                options.ExpireTimeSpan = TimeSpan.FromMinutes(30);
                options.LoginPath = "/Identity/Account/Login"; 
                options.LogoutPath = "/Identity/Account/Logout"; 
                options.AccessDeniedPath = "/Identity/Account/AccessDenied"; 
                options.SlidingExpiration = true;
            });

            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
                app.UseDatabaseErrorPage();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
                app.UseHsts();
            }

            app.UseHttpsRedirection();
            app.UseStaticFiles();
            app.UseCookiePolicy();

            app.UseAuthentication();

            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default",
                    template: "{Controller=Home}/{action=Index}/{id?}");
            });
        }
    }

Логин - Контроллер страницы ядра Identity:

public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
    returnUrl = returnUrl ?? Url.Content("return path");

    if (ModelState.IsValid)
    {

        var result = _signInManager.PasswordSignInAsync(Input.Email, Input.Password, Input.RememberMe, lockoutOnFailure: true).Result;
        if (result.Succeeded)
        {
            var usera = User.IsInRole("Role1");
            var users = User.IsInRole("Role2");

            //string userEmail = _signInManager.Context.User.FindFirst(ClaimTypes.Name).Value;
            //string userRole = _signInManager.Context.User.FindFirst(ClaimTypes.Role).Value;
            if (User.IsInRole("Admin"))
            {
                return RedirectToAction("path1");
            }
            else if (User.IsInRole("Supervisor"))
            {
               return RedirectToAction("path2");
            }
            else if (User.IsInRole("Member"))
            {
              return RedirectToAction("path3");
            }
            else
            {
                 return RedirectToPage("/Identity/Account/AccessDenied");
            }
        }
        if (result.RequiresTwoFactor)
        {
            return RedirectToPage("./LoginWith2fa", new { ReturnUrl = returnUrl, RememberMe = Input.RememberMe });
        }
        if (result.IsLockedOut)
        {
            _logger.LogWarning("User account locked out.");
            return RedirectToPage("./Lockout");
        }
        else
        {
            ModelState.AddModelError(string.Empty, "Invalid login attempt.");
            return Page();
        }
    }


    return Page();
}

1 Ответ

0 голосов
/ 18 февраля 2019

Если вы хотите получить информацию о роли после _signInManager.PasswordSignInAsync, вы можете напрямую запросить ее в базе данных:

var user = await _signInManager.UserManager.FindByEmailAsync(Input.Email);
IList<string> roles = await _signInManager.UserManager.GetRolesAsync(user);
...