我遇到一个问题,在他们成功登录后,asp.net身份框架会将用户重定向回登录页面。
这使用标准的Asp.net Core身份。它是版本2.1.1。生成剃须刀页面的脚手架。不知道这是否有意义。
我知道用户成功登录是因为我收到了日志消息
... Areas.Identity.Pages.Account.LoginModel:信息:用户已登录。
但是随后它将直接重定向回登录页面。
如果我使用提琴手,我可以看到请求上有一个cookie,因此从该角度来看一切都很好。
.AspNetCore.Identity.Application=CfDJ8KJxkuir9ZJIjFLCU2bzm9n6X...
所以我猜正在处理身份验证但不接受Cookie的中间件?
如果我能看到auth的实际中间件在做什么,我可能有一个主意,但找不到。
任何帮助表示赞赏
答案 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进行调整之后,我仍然遇到相同的问题。进行几次硬刷新可以解决此问题(也可以清除浏览器缓存)。