我有一个MVC 5应用程序,在.NET 4.6和MVC 5.2.3下开发,当我在我的机器上的Chrome和Edge中调试它时,它100%正常工作。当我在我的ISP部署到共享主机时,它在第一个成功并显示登录页面的请求之后的每个请求上都给出以下错误。
403 -禁止访问:访问被拒绝。您无权使用您提供的凭据查看此目录或页面。
然后,如果我从Chrome中清除了一个名为.AspNet.ApplicationCookie
的cookie,那么下一个请求会成功,但cookie又回来了,所有后续请求都以同样的方式失败。
我没有在自己的任何代码中使用应用程序状态,我添加到标准VS2015项目模板附带的包中的唯一包是:
AutoMapper
elmah.corelibrary
Elmah.Mvc
Unity
Unity.Mvc5
如果我没有做错,当我在Edge中检查cookie时,没有这样的cookie,只有__RequestVerificationToken
,它在Chrome中没有任何作用(超出了这个问题的范围)。
**注意:**我现在已经更换了托管服务提供商,从应用启动后的第一次请求后,几乎每次请求都得到403,而现在我每隔1到2分钟就被重定向到我的登录页面。看起来有一个提供商更好地处理了我缺少授权的问题,但我强烈怀疑这两个问题都是由于会话丢失造成的。这可能是由于共享托管上的资源有限,所以我尝试将会话存储在SQL Server上,但没有任何区别,Elamh也没有显示任何错误,所以我不知道我的会话移动是否有效。
2条答案
按热度按时间roejwanj1#
我认为你正在使用新的dotnet核心Cookie中间件。这个中间件在cookie值中加密你的会话数据。
问题是加密/解密是基于每个应用程序主机唯一的密钥(基于机器密钥)完成的。因此,如果您的请求落在与加密会话cookie的示例不同的示例上,它无法解密您的cookie,因此认为您没有通过身份验证!
您可以通过实现不同的后备存储(如redis或sql server)来更改此行为。
请阅读有关如何执行此操作的文档:https://learn.microsoft.com/en-us/aspnet/core/security/authentication/cookie
vxf3dgd42#
从Cookie名称来看,服务器似乎配置为使用Cookie身份验证,而您使用的是默认的Cookie名称。
这种类型的身份验证根据计算机密钥解密Cookie。由于它是共享计算机上的托管环境,因此它的解密方式与其他应用程序相同,并且其他应用程序可能使用相同的默认Cookie名称。
这将意味着身份验证是干扰其他应用程序,这就是为什么你得到403,即使我不完全确定的确切点的错误。
此问题的解决方案是在Startup.Auth.cs中设置一个不同的Cookie名称
这里有一个与设置cookie名称的代码示例相关的问题:Why do ASP.NET Identity logins from one site get shared with different websites on the same machine?
希望这能解决你的问题。