Asp.net核心身份成功登录重定向到登录页面

时间:2018-07-30 20:59:01

标签: c# asp.net asp.net-core asp.net-core-identity

我遇到一个问题,在他们成功登录后,asp.net身份框架会将用户重定向回登录页面。

这使用标准的Asp.net Core身份。它是版本2.1.1。生成剃须刀页面的脚手架。不知道这是否有意义。

我知道用户成功登录是因为我收到了日志消息

  

... Areas.Identity.Pages.Account.LoginModel:信息:用户已登录。

但是随后它将直接重定向回登录页面。

如果我使用提琴手,我可以看到请求上有一个cookie,因此从该角度来看一切都很好。

.AspNetCore.Identity.Application=CfDJ8KJxkuir9ZJIjFLCU2bzm9n6X...

所以我猜正在处理身份验证但不接受Cookie的中间件?

如果我能看到auth的实际中间件在做什么,我可能有一个主意,但找不到。

任何帮助表示赞赏

6 个答案:

答案 0 :(得分:7)

请注意,该订单很重要。我颠倒了这些,并经历了与原始海报完全相同的问题。在我弄清楚这一点之前已经浪费了几个小时...

    app.UseAuthentication();
    app.UseAuthorization();

答案 1 :(得分:4)

为了使ASP.NET Core管道能够识别用户已登录,需要在UseAuthentication类的Configure方法中调用Startup,例如所以:

app.UseAuthentication();
app.UseMvc(); // Order here is important (explained below).

使用Cookies身份验证方案,UseAuthentication的使用宽松地执行以下操作:

  • 从请求中读取.AspNetCore.Identity.Application cookie的内容,该内容代表发出请求的用户的身份。
  • 用代表该用户的User填充HttpContext的{​​{1}}属性。

这是对所发生情况的简化解释,但是它突出了身份验证中间件执行的重要工作。没有认证中间件,ClaimsPrincipal将不会用于认证用户,因此不会认证用户。在您的情况下,尽管用户已登录(即正在设置cookie),但是管道中间件(例如MVC)没有看到该用户(即未读取cookie),因此看到了未经身份验证的请求并针对登录。

鉴于身份验证中间件读取了cookie并随后填充了.AspNetCore.Identity.Application,因此应该清楚,ClaimsPrincipal的调用也必须在{em}之前呼叫以便此以正确的顺序发生。否则,MVC中间件将在身份验证中间件之前运行,并且将无法与填充的UseAuthentication一起使用。

  

如果不添加用于处理登录的中间件,为什么登录失败?!

中间件不处理登录-它处理身份验证过程。用户登录,通过UseMvc cookie的存在来确认。此处失败的是读取所述cookie。

答案 2 :(得分:1)

app.UseAuthentication(); app.UseMvc();

这已经在我的代码中了,但是我遇到了同样的问题。 但是问题出在我的机箱上的Chrome浏览器上,它正在与其他浏览器一起使用,例如mozilla。 在我清除了所有cookie和现金后,它也开始在Chrome上运行。

答案 3 :(得分:0)

除了使用@Kirk Larkin以外,如果使用.net core 3(目前为预览版),则为答案

将startup.cs中的“ app.UseEndpoints”放入代码块的结尾。

例如应该按此顺序

        app.UseAuthentication();
        app.UseAuthorization();

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

答案 4 :(得分:0)

我尝试了许多建议,最后对我有用的是: 首先,在“ Startup.cs”中的ConfigureServices类中添加此

client_id = {your client id string}
client_secret = {your client secret}
company_id = {your company id from Paylocity dashboard, without leading 'CS'}
prod_auth_url = 'https://api.paylocity.com/IdentityServer/connect/token'
body_params = urllib.parse.urlencode({'grant_type': 'client_credentials','scope':'WebLinkAPI'})
# Requests can use auth= for basic authentication
auth_response = requests.post(prod_auth_url,auth=(client_id, client_secret), data=urllib.parse.urlencode(body_params))
response = json.loads(auth_response.content)
api_call_headers = {'Authorization': 'Bearer ' + response['access_token']}
# Get all employees for a company
empl_response = requests.get(f"https://api.paylocity.com/api/v2/companies/{company_id}/employees/",headers=api_call_headers, verify=False)
pd.DataFrame(json.loads(empl_response.text))

上面的代码应在此之后:

services.AddMvc().AddMvcOptions(Mvcoption => {
            Mvcoption.EnableEndpointRouting = false;
        });

以防万一您没有以上两个代码,请尝试将它们包含在mvc应用程序中。然后,您可以继续将它们添加到您的Configure方法中。

services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
                .AddCookie(options =>
                {
                    options.LoginPath = "/Home/Login";


                });

希望它现在可以正常工作。

祝您编程愉快!

答案 5 :(得分:0)

我不得不做几个这样的解决方案。

首先,我有app.UseAuthentication();和app.UseAuthorization();

第二,在对startup.cs进行调整之后,我仍然遇到相同的问题。进行几次硬刷新可以解决此问题(也可以清除浏览器缓存)。