使用Identity Core在ASP.Net Core 2.1中登录后立即添加重定向

问题描述 投票:1回答:1

嗨,大家好我试图在使用Identity Core登录.Net Core 2.1应用程序后立即实现重定向。

重定向取决于登录用户的角色。

我得到一个Null Reference异常。

我读了一些堆栈溢出问题和Git问题,并了解这是因为登录后用户没有立即存储到数据库:

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引用异常;我理解这是因为请求没有完成。

但是我不明白出了什么问题。

需要方向。

谢谢:)

这是我的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?}");
            });
        }
    }

登录 - 身份核心的页面控制器:

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();
}
asp.net .net asp.net-core asp.net-identity claims-based-identity
1个回答
1
投票

如果你想在_signInManager.PasswordSignInAsync之后获取角色信息,你可以在数据库中直接查询:

var user = await _signInManager.UserManager.FindByEmailAsync(Input.Email);
IList<string> roles = await _signInManager.UserManager.GetRolesAsync(user);
© www.soinside.com 2019 - 2024. All rights reserved.