我们的SSO登录过程对SQL Server中的自定义用户存储使用表单身份验证.
我们的新安全要求之一是仅允许帐户一次拥有一个活动会话.因此,只要用户登录,我们就会检查登录凭据是否已经处于活动状态,并且最好阻止新用户再次登录,直到其他会话结束.或者,如果更容易实现,我们可以强制其他会话结束.
使用表单身份验证有一种简单的方法吗?我们已经考虑了一种自定义方法,我们跟踪数据库中的每个会话,但这将是很多工作,我们可能必须修改我们的所有应用程序来检测session_end,我希望避免.我认为Forms Auth中必须有一些东西来处理这个问题.
我见过MembershipUser.IsOnline()方法,看起来很理想,但我们没有使用会员提供程序.
更新:为了清楚,我不需要检查当前用户是否已登录,我需要知道其他人是否已使用同一帐户登录.
我正在玩认证和授权以准备一些任务.我创建了两个页面:Login.aspx和Default.aspx.在配置文件中,我为表单设置了身份验证,并拒绝了未经身份验证的用户访问:
<authentication mode="Forms">
<forms name="aaa" defaultUrl="~/Login.aspx" />
</authentication>
<authorization>
<deny users="?"/>
</authorization>
Run Code Online (Sandbox Code Playgroud)
然后我写了一些简单的代码来验证我在Login.aspx中的用户:
protected void Page_Load(object sender, EventArgs e)
{
GenericIdentity identity = new GenericIdentity("aga", "bbb");
Context.User = new GenericPrincipal(identity, new String[] { "User" }); ;
Response.Redirect("~/Default.aspx");
}
Run Code Online (Sandbox Code Playgroud)
当我运行它时,重定向不会发生.而是一遍又一遍地调用Login.aspx,因为用户未经过身份验证(每次加载时Context.User.Identity.IsAuthenticated都为false).我究竟做错了什么?
我正在尝试在我当前的winforms项目中实现授权和身份验证.身份验证还必须匹配SQL Server 2008数据库中的用户.问题是,它是一个多用户程序,因此当添加新用户时,会创建一个数据库并将用户身份添加到数据库中.
我想知道这是否可能实施IPrincipal和IIdentity.到目前为止我只找到了ASP.NET实现.
任何人都可以给我一些指导,了解在winforms应用程序中实现密码/用户标识安全性的最佳方法是什么?请记住,必须使用SQL Server中的数据库进行验证.
这意味着该用户必须存在数据库,并且其凭据必须正确.
我有一个FormsAuthentication cookie,它是永久性的,并且可以在开发,测试和生产环境中独立工作。我有一个可以进行身份验证的用户,创建了用户对象,并将身份验证Cookie添加到了响应中:
'Custom object to grab the TLD from the url
authCookie.Domain = myTicketModule.GetTopLevelDomain(Request.ServerVariables("HTTP_HOST"))
FormsAuthentication.SetAuthCookie(authTicket.Name, False)
Response.SetCookie(authCookie)
Run Code Online (Sandbox Code Playgroud)
对用户进行一点点处理以检查第一次登录,安全性问题等,然后使用以下提示重定向用户:
Session.Add("ForceRedirect", "/FirstTimeLogin.aspx")
Response.Redirect("~/FirstTimeLogin.aspx", True)
Run Code Online (Sandbox Code Playgroud)
通过调试中断,我可以验证cookie集合是否既包含与我出于不同目的设置的身份验证无关的cookie,也包含表单身份验证cookie。然后,该过程的下一步发生在global.asax中的ApplicationAuthenticateRequest处:
Sub Application_AuthenticateRequest(ByVal sender As Object, ByVal e As EventArgs)
Dim formsCookieName As String = myConfigurationManager.AppSettings("FormsCookieName")
Dim authCookie As HttpCookie = Request.Cookies(formsCookieName)
Run Code Online (Sandbox Code Playgroud)
在这一点上,对于这个一个用户authCookie来说还算是什么。我还有15,000个其他用户没有受到这种方式的影响。但是,对于一个用户而言,cookie只是消失了而没有任何痕迹。我以前已经通过w3wp.exe异常,状态服务器异常和其他与IIS进程相关的异常看到了这一点,但是事件日志中没有任何异常。w3wp.exe不会崩溃,状态服务器有一些超时,但它们似乎不相关(已通过时间戳验证),并且仅在该一个域中的该用户身上发生(此代码在2个不同的TLD中使用,大约有10个其他子域) 。
我正在调查的一条途径是cookie可能太大了。我认为应该检查进入响应的cookie的大小,并且我认为它不会以这种方式对其产生影响。关于请求为何可能转储cookie的任何想法?
注意:我提到的我设置的辅助cookie也将被转储(非常小)。
编辑注释:发生这种情况时,会话令牌不会丢失。但是,由于身份验证cookie丢失,因此它将被忽略并在后续登录时被替换。
使用ASP.NET的表单身份验证时,查询字符串键将传递给登录页面,该页面名为"ReturnUrl".
例如,如果您尚未登录并且想要查看类似的安全页面http://www.example.com/securepage.aspx,则会被重定向到:
http://www.example.com/login.aspx?ReturnUrl=securepage.aspx
Run Code Online (Sandbox Code Playgroud)
(或类似的东西,我不太确定ReturnUrl值).
现在,有没有办法将此ReturnUrl名称更改path为例如?我们在web.config中有一种配置吗?
我正在使用VS 2010在本地计算机上进行一些开发,并在Cassini中运行我的开发代码,我还制作了相同代码的副本并将其部署到c:\ mp并在IIS7中设置了一个Web应用程序以指向此目录。
两个应用程序都指向不同的数据库。我通过http:// localhost / mp访问IIS
当我登录其中任何一个时,如果我已经登录,则会导致我从另一个注销。
我感觉这与我们正在使用的表单身份验证有关,并且可能会覆盖cookie,但是我还没有发现任何有用的东西。
表单身份验证设置如下所示
<authentication mode="Forms">
<forms name="MP" loginUrl="~/login.aspx" protection="All" timeout="20" path="/" slidingExpiration="true" cookieless="UseCookies" defaultUrl="~/Modules/Enquirer/Default.aspx" />
</authentication>
Run Code Online (Sandbox Code Playgroud)
我们还使用角色和成员资格提供者
<roleManager enabled="true" cacheRolesInCookie="true" defaultProvider="AspNetSqlRoleProvider">
<providers>
<clear />
<add name="AspNetSqlRoleProvider" connectionStringName="mpconnectionstring" applicationName="mp" type="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
</providers>
</roleManager>
<membership defaultProvider="AspNetSqlMembershipProvider" userIsOnlineTimeWindow="20" hashAlgorithmType="SHA1">
Run Code Online (Sandbox Code Playgroud)
尽管我不确定这是否会成为问题,但我们也都使用了inProc会话状态。
谁能说出为什么发生这种情况以及如何解决呢?
我基本上做的是这个.但是,每当我使用内置的AuthorizeAttribute时,MVC框架(我猜)都不会查看我的主体以确定用户是否具有适当的角色.它一直试图在app_data目录中创建一个新的MDF文件,因为它没有特权,所以它会爆炸.
这是预期的行为,我应该自己派生自己的AuthorizeAttribute并检查校长吗?
另一个奇怪的行为是,我在同一个域上有两个站点,我正在进行单点登录.在任一站点上,我使用相同的类库在AuthenticateRequest上重新创建我的自定义主体,并且我在调试时看到主体在每个站点上正确设置.但是,站点1(对用户进行身份验证的站点)使用内置的AuthorizeAttribute,它可以正常工作,但站点2正在尝试在调用具有AuthorizeAttribute的任何操作时创建MDF文件.
我和另外4个人一起做团体项目.我们正在使用嵌入式c#和Razor在MVC4中设计ASP.NET中的作业信息亭.它从服务器生成动态网页.我们在Windows 7环境中使用Visual Studio 2010 SP1和Microsoft SQL Server 2008 R2 SP1.
我正在努力让系统在闲置10分钟后将用户注销.我需要一些帮助,如何开始编码系统记录用户的方式.我基本上编写一个控制器来编辑我的组中其他成员已经完成的视图(网页).这样,计时器就会在所有视图页面上启动.
我一直试图让我的登录页面无法访问已登录的用户.除非他们没有登录,否则应该将他们重定向到他们的仪表板.
我做了以下工作,但他们都没有工作.有解决方案的人请?
// GET: /Account/Login
[AllowAnonymous]
public ActionResult Login(string returnUrl)
{
if (Request.IsAuthenticated)
{
RedirectToAction("Index", "Dashboard");
}
ViewBag.ReturnUrl = returnUrl ?? Url.Action("Index","Dashboard");
return View();
}
Run Code Online (Sandbox Code Playgroud)
这也是
// GET: /Account/Login
[AllowAnonymous]
public ActionResult Login(string returnUrl)
{
if (User.Identity.IsAuthenticated)
{
RedirectToAction("Index", "Dashboard");
}
ViewBag.ReturnUrl = returnUrl ?? Url.Action("Index","Dashboard");
return View();
}
Run Code Online (Sandbox Code Playgroud)
任何指南将不胜感激.谢谢
我有验证登录表单(带有“记住我”的选项)并验证用户身份(如果有效)的代码。然后,我设置表单身份验证cookie并重定向。
auth cookie设置如下,persistent参数是true用户是否选择了“记住我”。
FormsAuthentication.SetAuthCookie(response.UserObject.UserName, persistent);
Response.Redirect(url);
Run Code Online (Sandbox Code Playgroud)
我们已经在各种浏览器中对此进行了测试,并且总体来说还不错。但是,在Firefox中,.ASPXFORMSAUTHcookie始终是会话cookie,即使关闭了persistent以上参数,该cookie也会在关闭浏览器时过期true。
我正在测试的Firefox版本是55.0.3(32位)。这是一个已知的错误?还是有其他原因导致Firefox不允许我设置持久性Cookie?难道它不再接受永久性cookie作为302重定向响应的一部分吗?