使用 Web api 成功登录 mvc core 3.0 后 User.Identity.IsAuthenticated = false

2023-12-23

这很明显是问题所在。

我的 api 中的登录功能

        public async Task<object> Login([FromBody] LoginDto model)
        {
            var user = _context.Users.FirstOrDefault(x => x.Email == model.Email || x.UserName == model.Email);
            var result = await _signInManager.PasswordSignInAsync(user.UserName, model.Password, model.RememberMe, false);
            var IsAuthenticate = User.Identity.IsAuthenticated;
            await _signInManager.SignInAsync(user, model.RememberMe);
            if (result.Succeeded)
            {
                var appUser = _userManager.Users.SingleOrDefault(r => r.Email == model.Email);
                return await GenerateJwtToken(model.Email, appUser);
            }

            return BadRequest("INVALID_LOGIN_ATTEMPT");
        }

我在mvc中使用consum api的登录功能 _client.LoginAsync() 是使用 api 进行登录的静态函数

    public async Task<IActionResult> Login(LoginDto model, string returnUrl = null)
    {
        ViewData["ReturnUrl"] = returnUrl;
        if (ModelState.IsValid)
        {
            try
            {
                await _client.LoginAsync<LoginDto>(new Uri(_appSettings.WebApiBaseUrl + "Account/Login"), model);
                ApplicationManager.SetMessageToUser("تم تسجيل الدخول بمجاح");
                await _signInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, false);
                return Redirect("/" + returnUrl);
            }
            catch
            {

            }
        }
        ApplicationManager.SetMessageToUser("تأكد من اسم المستخدم وكلمة المرور");

        // If we got this far, something failed, redisplay form
        return View(model);
    }

_client.LoginAsync() 是使用 api 进行登录的函数

public async Task<string> LoginAsync<T>(Uri requestUrl, T content)
        {
            addHeaders();
            var response = await _httpClient.PostAsync(requestUrl.ToString(), CreateHttpContent<T>(content));
            string st = response.Content.ReadAsStringAsync().Result;

            response.EnsureSuccessStatusCode();
            var data = await response.Content.ReadAsStringAsync();
            return (string)data;
        }

我的服务配置

public void ConfigureServices(IServiceCollection services)
{
    services.AddSession(options => {
        options.IdleTimeout = TimeSpan.FromMinutes(60);
    });
    services.Configure<AppSettings>(Configuration.GetSection("AppSettings")); 
    services.AddDbContext<ApplicationDbContext>(opt =>
       opt.UseSqlServer("Data Source=.;Initial Catalog=ECommerceWebDb;Integrated Security=True"));

    services.AddIdentity<IdentityUser, IdentityRole>(options =>
    {
        options.Password.RequireNonAlphanumeric = false;
        options.Password.RequiredLength = 8;
        options.User.RequireUniqueEmail = true;
    })
       .AddEntityFrameworkStores<ApplicationDbContext>()
       .AddDefaultTokenProviders();

    services.AddControllers();
    services.AddCors();
    services.AddMvc();
    services.AddControllersWithViews();
    services.AddRazorPages();
    var appSettingsSection = Configuration.GetSection("AppSettings");
    services.Configure<AppSettings>(appSettingsSection);

    // configure jwt authentication
    var appSettings = appSettingsSection.Get<AppSettings>();
    var key = Encoding.ASCII.GetBytes(appSettings.Secret);
    services.AddAuthentication(x =>
    {
        x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
        x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;

    })
    .AddJwtBearer(x =>
    {
        x.RequireHttpsMetadata = false;
        x.SaveToken = true;

        x.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuerSigningKey = true,
            IssuerSigningKey = new SymmetricSecurityKey(key),
            ValidateIssuer = false,
            ValidateAudience = false
        };
    });
}

// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{

    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
        // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
        app.UseHsts();
    }

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

    app.UseRouting();

    app.UseCors();


    app.UseAuthentication();

    app.UseAuthorization();
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllerRoute(
         name: "default",
         pattern: "{controller=Home}/{action=Index}/{id?}");

        endpoints.MapAreaControllerRoute(
         name: "areas", "areas",
         pattern: "{area:exists}/{controller=Home}/{action=Index}/{id?}");
        endpoints.MapRazorPages();
    });
}

我对这个错误真的很复杂 我认为这就是每一件事,如果您想要更多帮助我,请告诉我。


SignIn 会保留给定的信息以供将来请求,但不会设置HttpContext.User在当前的。所以User.Identity.IsAuthenticated在后续请求中将为 true

参考

https://github.com/aspnet/Security/issues/1318 https://github.com/aspnet/Security/issues/1318

https://learn.microsoft.com/en-us/archive/msdn-magazine/2017/september/cutting-edge-cookies-claims-and-authentication-in-asp-net-core#foundation-of-aspnet-验证 https://learn.microsoft.com/en-us/archive/msdn-magazine/2017/september/cutting-edge-cookies-claims-and-authentication-in-asp-net-core#foundation-of-aspnet-authentication

在 ASP.NET 中,用户身份验证涉及 cookie 的使用。任何尝试访问私人页面的用户如果没有携带有效的身份验证 cookie,都会被重定向到登录页面。登录页面在验证所提供的凭据后,会发出 cookie,然后该 cookie 会与该用户通过同一浏览器发出的任何后续请求一起传输,直到 cookie 过期。这与您可能从过去版本的 ASP.NET 中了解到的基本工作流程相同。在 ASP.NET Core 中,只是因为中间件的不同以及运行时环境的配置不同而看起来有所不同。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Web api 成功登录 mvc core 3.0 后 User.Identity.IsAuthenticated = false 的相关文章

随机推荐

  • 如何使用lua设置bash环境变量

    我对 lua 脚本功能很陌生 我尝试使用 os execute 导出 MY VAR 10 io popen 导出 MY VAR 10 来自lua脚本 我尝试在执行 lua 脚本后使用 echo MY VAR 从 shell 读取 MY VA
  • 检查一个列表中的任何元素是否在另一个列表中[重复]

    这个问题在这里已经有答案了 我正在尝试比较两个列表 如果第一个列表中的任何值在第二个列表中 则简单地打印一条消息 def listCompare list1 1 2 3 4 5 list2 5 6 7 8 9 if list1 in lis
  • 缺少样式。是否为此布局选择了正确的主题?

    缺少样式 是否为此布局选择了正确的主题 使用布局上方的主题组合框选择不同的布局 或修复主题样式参考 找不到款式mapViewStyle在当前主题中 我尝试了所有可用的解决方案来解决这个问题 但似乎没有任何效果 我已将库包含在清单文件中 我什
  • Sql Server:当“强制外键约束”设置为“否”时,使用它有什么好处?

    我知道 RDBMS 中 强制外键约束 的目的 但是设置为 NO 有什么好处吗 在正常生产中 此设置应该never被设置为NO 但是 当您开发或重组数据库时 或者当您执行诸如以下操作时 您需要 清理 清理 大量数据 那么关闭外键约束以允许将
  • 主从视图 ASP.NET MVC

    我是 MVC 新手 参与了一个使用 ASP NET MVC 1 0 开发的项目 我的 JavaScript 也很弱 我试图演示主详细信息视图如何在 Northwind 数据库中的 订单 和 订单详细信息 表上工作 因此 表之间存在关系 即一
  • 如何找到多维数组中最长的字符串?

    我试图从多维数组中获取最长的字符串 但由于某种原因它不起作用 这就是我所拥有的 a MAKKGKPRPDHRPPAHNPHYAHDPPPYSQQQPPLQQQNYAQQMNRQHARPRPSPPSEVSDCVKYSLFLYNCIFWVSMH
  • InputBindings 仅在聚焦时才起作用

    我设计了一个可重用的用户控件 它包含 UserControl InputBindings 它非常简单 因为它只包含一个标签和一个按钮 以及新属性等 当我在窗口中使用该控件时 它运行良好 但键绑定仅在聚焦时才起作用 当一个控件绑定到 alt
  • Android 应用程序:获取 Google Drive API 的访问令牌

    我正在编写一个 Android ICS 版本 应用程序 它将数据上传到 Google Drive 该应用程序 使用 oauth2 获取访问令牌 第一步 获取授权令牌 String AUTH TOKEN TYPE oauth2 https w
  • Java 32位与64位优化模式(-XX:-UseCompressedOops)内存开销

    我试图预测当我在配置为使用超过 32GB 内存的 JVM 中运行 Java 应用程序时的堆内存需求变化 我预计 在将 Xmx 参数从 32GB 重新配置到 64GB 后 我在内存中保留的相同数量的 有用 对象将会产生显着的内存开销 我尝试通
  • 在类之间传递记录器

    我的项目中有两个类 我想将记录器从主类传递到子类 并让子类利用父类的记录器设置 子类是一个单独的通用类 即不依赖于主类 如果没有提供记录器 则必须能够创建自己的记录器 主类创建一个记录器 添加一个控制台处理程序 文件处理程序和日志格式化程序
  • 如何抑制“类可能无法响应具有变量方法名称的‘-method’警告?

    如何使用变量选择器名称来防止此警告 NSString methodName SEL method NSSelectorFromString methodName if self respondsToSelector method if me
  • 如何在c#中使用xsd?

    我是 xml 的新手 我使用 xsd exe 从 xml 创建一个 xsd 文件和一个 cs 文件 但我现在不知道什么或如何访问它 我看过一些例子 但发现它们令人困惑 有没有简单的教程或者有人可以给我的例子
  • 启用 TLS 的 mosquitto_sub

    我是 MQTT 新手 遇到一个令人沮丧的问题 我一直在使用MQTT fx订阅一个主题 我已经设置了 经纪商地址 Port 客户ID Enable SSL TLS Topic 这很好用 但我想使用 mosquitto sub 我尝试通过以下方
  • 如何安装 php 5.2 的 Composer? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我想下载 php 5 2 的旧版作曲家 如何安装 php 5 2 的 Composer 你不能 因为Composer 需要 PHP 5 3
  • CEFsharp 浏览器等待网站完全加载

    我正在使用 CEFsharp 浏览器 并通过 LoadingStateChanged 事件确定页面完成加载 但它会触发多次 我只需要在页面完全加载后才触发它 该怎么办 private async void Browser LoadingSt
  • 错误构建:无法直接与 dylib/framework XCTAutomationSupport for Architecture arm64 链接

    我正在使用 Xcode Beta 14 尝试构建 WebDriverAgent 低于错误 WebDriverAgent 构建 产品 调试 iphoneos WebDriverAgentLib framework WebDriverAgent
  • 强制 UiView 播放 YouTube 视频

    我正在创建一个包含 YouTube 视频的应用程序 对于这个应用程序 我需要一种方法来强制打开 YouTube 视频 我怎样才能强制它启动 我看过这个 webView userInteractionEnabled NO 但似乎不知道如何使用
  • 如何覆盖 django 电子邮件中的发件人地址(通过 Gmail 发送)

    在我的 settings py 中 我有以下值 EMAIL HOST smtp gmail com EMAIL PORT 587 EMAIL HOST USER us email protected cdn cgi l email prot
  • 如何在 WPF 中实现复选框列表框?

    尽管在编写 Winforms 应用程序方面有一定的经验 但 WPF 的 模糊性 在最佳实践和设计模式方面仍然让我困惑 尽管在运行时填充我的列表 但我的列表框显示为空 我已按照以下简单说明进行操作这篇有用的文章 http merill net
  • 使用 Web api 成功登录 mvc core 3.0 后 User.Identity.IsAuthenticated = false

    这很明显是问题所在 我的 api 中的登录功能 public async Task Login FromBody LoginDto model var user context Users FirstOrDefault x gt x Ema