我正在使用Forms身份验证.
在Windows身份验证中获取我使用的PC的用户名: User.Identity.Name
我也需要在Forms身份验证中使用此信息,但User.Identity.Name不起作用.
如何在不使用Windows身份验证的情况下获取User.Identity.Name?
我有一个在ie下运行的基本网站(Asp.net WebForms应用程序).
http://localhost:90/
Run Code Online (Sandbox Code Playgroud)
然后我创建了一个新的(这次是Asp.net MVC)应用程序并添加了它
http://localhost:90/mvc/
Run Code Online (Sandbox Code Playgroud)
但不仅仅是作为一个简单的虚拟文件夹,而是作为一个应用程序文件夹,通过定义一个不同的应用程序池来运行它,与父应用程序相比.
由于浏览器无法知道基本上在同一个域上有两个不同的应用程序,它的工作方式如下:
http://localhost:90/http://localhost:90/mvc我是否有可能根据同一个cookie对用户进行身份验证?我将配置我的MVC应用程序登录重定向到父应用程序以具有共享身份验证屏幕.但是我想知道从那时起谁经过认证和工作.
我已经阅读了一些关于共享相同system.web/machineKey值以提供此类功能的内容,但我想要一些真实世界的示例.
我知道这两个应用程序将无法共享会话状态,这不是问题,因为我不希望它们.我想要的只是一种单一登录(SSO/SSS)
这可能吗?怎么样?
我已经阅读了有关此问题的其他问题/答案,但他们要么是询问跨域/跨服务器等.这个问题都在同一个IIS网站上.
我在ASP.NET MVC Web应用程序中启用了表单身份验证.我想允许匿名用户只访问某些特定页面,例如Register.cshtml.通过这样做,我能够允许从我的根web.config访问我的CSS文件.
<location path="Content/Site.css">
<system.web>
<authorization>
<allow users="*"/>
</authorization>
</system.web>
</location>
Run Code Online (Sandbox Code Playgroud)
现在我想允许匿名访问其他页面,如Home和Register.有人知道如何实现这个目标吗?
我看到我的服务器上的请求似乎是由一个无关的客户端发出的,虽然我确定它们是由经过身份验证的用户制作的 - 我有fiddler日志显示客户端发送了有效的asp.net auth cookie和服务器日志表明cookie已到达且有效.所有浏览器都出现了这个问题.
数据流是:
思考?
现在详细说明:
极少数的异步请求落在我的服务器上(有证据表明它们没有被操纵或伪造)并且似乎是匿名的.在提出的7个请求中,有些数字可能有效,也可能无效(即5/7会成功,2会失败).成功/失败似乎没有任何模式.在我的请求看起来是匿名的情况下,CurrentPrincipal.Identity记录:
Thread.CurrentPrincipal.Identity.IsAuthenticated; // false
Thread.CurrentPrincipal.Identity.Name; // null (or empty, unsure off hand)
Run Code Online (Sandbox Code Playgroud)
将http.context.request.params集合转储到日志文件中,我能够看到以下相关(和擦除)属性(下面的完整参数):
context: {"userId":10000,"userName":"johnsmith"}
HTTP_COOKIE:.ASPXAUTH=[valid auth cookie value]
HTTP_X_REQUESTED_WITH:XMLHttpRequest
X-Requested-With: XMLHttpRequest
AUTH_TYPE:
AUTH_USER:
AUTH_PASSWORD:
LOGON_USER:
REMOTE_USER:
HTTP_COOKIE: .ASPXAUTH=[valid auth cookie value]
Run Code Online (Sandbox Code Playgroud)
我知道auth cookie是有效的 - 在这些相同的请求期间,我能够解密auth cookie并提取以下内容:
CookiePath: /
Expiration: 9/23/2105 8:14:22 PM
Expired: False
IsPersistent: True
IssueDate: 8/30/2010 2:54:22 PM
Name: johnsmith
UserData:
Version: 2
Run Code Online (Sandbox Code Playgroud)
不知道如何继续这一点.我们最近迁移到mvc 2.0/asp.net 4.0似乎加剧了这个问题,但我的信心并不高.
我已经联系了一些有这个问题的客户,而且这更令人沮丧(但确实反映了我在日志中能够阅读的内容).一旦进入这种状态,就很难摆脱它.清除缓存和cookie似乎没有任何效果.但是,切换到新的浏览器,一般都可以.同样地,等待几个小时并使用相同的浏览器返回它也一般都可以,但并非总是如此.如前所述,所有浏览器都可以看到这种情况.
有什么建议?
凯文
------------
以下是我捕获的日志片段的剩余部分(为pii擦除):
8/30/2010 2:54:43 PM: …Run Code Online (Sandbox Code Playgroud) 我的css,js,图像文件的请求正在通过ASP.NET管道提供.我认为IIS默认避免这种情况,但是我在Application_AuthenticateRequest断点上看到了请求,并且不需要实际验证这些请求.我看到了改变这种行为的相互矛盾的方法 - 最好的方法是什么?
我有一个带有表单身份验证的ASP.NET MVC 3应用程序.由于某些我无法看到的原因,登录重定向网址/Account/Login?ReturnUrl=%2fSecure%2fAction代替/Account/LogOn?ReturnUrl=%2fSecure%2fAction.区别很小,它使用/ Account/Login而不是/ Account/LogOn.
我的web.config表单部分是正确的.否则可能会影响登录网址?
<authentication mode="Forms">
<forms loginUrl="~/Account/LogOn" timeout="720" />
</authentication>
Run Code Online (Sandbox Code Playgroud) 读这个问题
不同的用户在aspxanonymous中获得相同的cookie值
并且我开始思考,如果某个人可以通过某种方式真正窃取cookie,然后将其放在他的浏览器上,登录就可以说是管理员了.
您是否知道表单身份验证如何确保即使cookie被存储,黑客也不会使用它进行实际登录?
或者你知道其他任何自动防御机制吗?
先谢谢你.
我有这个旧的MVC5应用程序,它以最简单的形式使用表单身份验证.web.config中只存储一个帐户,没有角色等.
<authentication mode="Forms">
<forms loginUrl="~/Login/Index" timeout="30">
<credentials passwordFormat="Clear">
<user name="some-user" password="some-password" />
</credentials>
</forms>
</authentication>
Run Code Online (Sandbox Code Playgroud)
登录例程只是调用
FormsAuthentication.Authenticate(name, password);
Run Code Online (Sandbox Code Playgroud)
就是这样.在asp.net核心中是否有类似的(在简单性方面)?
我想在auth cookie的用户数据部分中存储一些数据,如用户昵称和用户ID(表主键).我这样做的原因是在浏览器关闭时保留这些数据,而无需用户重新登录.
编辑:哎呀!意识到我没有很好地解释自己.我不是试图根据他们的cookie重新验证用户.用户已经通过ASP.Net的会员系统进行了身份验证 - 这部分很好.我的问题是,如果我想显示用户的昵称,例如,我必须触发另一个SQL查询,然后将其存储在会话中.我认为将这些信息存储在UserData部分中的auth cookie(再次,由ASP.Net创建的那个)中是有意义的,这似乎是为此目的而创建的.
我不想使用配置文件,因为我有自己的用户表和配置文件数据,我需要一个轻量级的解决方案.
在auth cookie的用户数据部分对这些数据进行编码的好方法是什么?我在想序列化,但这可能有点过分.我是以错误的方式来做这件事的吗?
在使用FormsAuthentication配置的一个应用程序中,当用户访问没有auth cookie或过时的访问受保护页面时,ASP.NET会发出HTTP 401 Unauthorized,然后FormsAuthentication模块在请求结束前拦截此响应,并将其更改为HTTP 302 Found,设置HTTP标头"Location:/ path/loginurl"以便将用户代理重定向到登录页面,然后浏览器转到该页面并检索登录页面,该页面未受保护,获取HTTP 200好的.
当AJAX没有被考虑时,这确实是一个非常好的主意.
现在我在我的应用程序中有一个返回JSON数据的URL,它需要用户进行身份验证.一切运作良好,问题是如果auth cookie到期,当我的客户端代码调用服务器时,它将获得HTTP 200 OK和登录页面的html,而不是HTTP 401 Unauthorized(因为之前解释过).然后我的客户端试图将登录页面html解析为json,并失败.
那么问题是:如何应对来自客户端的过期身份验证?应对这种情况的最优雅解决方案是什么?我需要知道调用何时成功,我想使用HTTP语义来实现.
是否可以以安全的跨浏览器方式从客户端读取自定义HTTP标头?如果请求是AJAX请求,有没有办法告诉FormsAuthenticationModule不执行重定向?有没有办法使用HTTP标头覆盖HTTP状态,就像覆盖HTTP请求方法一样?
我需要Forms身份验证,我想避免重写该模块或编写自己的表单身份验证模块.
问候.
asp.net ×5
asp.net-mvc ×5
c# ×4
ajax ×1
asp.net-core ×1
cookies ×1
http ×1
iis-7 ×1
iis-7.5 ×1
jquery ×1
membership ×1
security ×1
shared ×1
static-files ×1