我基本上使用 ASP.NET MVC 示例中的 AccountController。它使用 FormsAuthentication 来处理用户登录。可以肯定的是,这里是处理用户登录的代码:
public ActionResult LogOn(string userName, string password, bool rememberMe, string returnUrl)
{
if (!ValidateLogOn(userName, password))
{
return View();
}
FormsAuth.SignIn(userName, rememberMe);
//Session["userId"] = 1;
if (!String.IsNullOrEmpty(returnUrl))
{
return Redirect(returnUrl);
}
else
{
return RedirectToAction("Index", "Home");
}
}
Run Code Online (Sandbox Code Playgroud)
从注释行中可以看出,我想在此方法中设置一个 Session 变量。但是,我认为这不是直接在控制器中设置 Session 变量的最优雅的方式。对这个方法进行单元测试也很不方便(虽然我可以模拟它,当然,但仍然如此)。
所以,我想,我创建了一个在此登录例程之后运行的自定义 ActionFilterAttribute。如果登录成功,请在此自定义属性中设置会话变量。代码如下:
public class SetSessionAttribute : ActionFilterAttribute
{
public override void OnResultExecuted(ResultExecutedContext resultContext)
{
if (resultContext.HttpContext.User.Identity.IsAuthenticated)
{
resultContext.HttpContext.Session["userId"] = 1;
}
base.OnResultExecuted(resultContext);
}
}
Run Code Online (Sandbox Code Playgroud)
问题是User.Identity.IsAuthenticated在下一次“页面加载”之前总是返回 false。我正在重写,OnResultExecuted因为我认为它是页面生命周期中最后一个要调用的方法,但没有运气。我也试过OnActionExecuting, …
我在一家拥有多个面向公众的网站的公司工作。
其中一些站点是使用第三方产品(Moveable Type、myBB、Trac 等)构建的。我们还有几个基于 Microsoft 堆栈构建的定制站点。
目前,我们没有统一的认证/授权解决方案;每个站点都实现自己的用户存储。
我热衷于在所有站点上实施统一的用户身份验证。我不希望实现单点登录(如果在切换站点时提示用户输入凭据,这不会很糟糕),但我确实需要每个用户都有一个用户名和密码。
在我看来,最可能的解决方案是实现 LDAP 服务器。我们使用的一些第三方产品支持 LDAP,我可以修改我们的定制站点以使用 LDAP。
但是,我从未使用过 LDAP 存储来管理外部用户(我一直在构建自己的用户存储)。
使用 LDAP 的优缺点是什么?我是否忽略了其他选择?
谢谢
沙
authentication forms-authentication ldap active-directory openldap
SQL Server 2008(不是 R2)。我试图允许用户在用户只能通过 Internet 访问的报告服务器上构建和部署 SSRS 报告。我创建了一个自定义表单身份验证提供程序。
我现在可以通过报表管理器或报表生成器 2.0 通过 Internet 连接到报表服务器。我想做的是为用户提供一个他/她可以在报告中使用的共享数据源。我已经创建了一个数据源,其凭据存储在服务器上。现在,我可以创建报告并添加共享数据源。但是,当我尝试添加数据集时,系统会提示我输入数据源的凭据。如果我可以通过网络访问数据库服务器,我可以输入凭据,一切正常。但是,当通过 Internet 工作时(无法从防火墙外部访问数据库服务器),它会失败并显示“登录失败”。
我认为当我这样做时,它试图直接连接到数据库服务器,而不是通过报表服务器连接并使用共享数据源。如果我在服务器上使用共享模型而不是数据源,它可以正常工作,但我希望使用数据源的灵活性。
这可能吗?如果没有,有人知道 R2/RB3 是否有不同吗?我无法访问 R2 进行测试。
提前致谢,
乔什
我有一个使用表单身份验证的网站,我的困境是我需要用户Default.aspx在第一次导航到带有“www.[site].com”的网站时点击该页面。然后他们可以选择单击登录链接以重定向到登录页面并从那里登录到网站。
现在,每当您请求该网站时,您总是会看到登录页面。我不确定我是否使用了正确的方法?
有什么想法吗?
更新:像这样的流程:
Default.aspxLoginStatus配置有图像的控件Login.aspx考虑到 web.config 看起来像:
<authentication mode="Forms">
<forms loginUrl="Default.aspx" timeout="20" protection="None" cookieless="UseCookies"/>
</authentication>
Run Code Online (Sandbox Code Playgroud)
控制LoginStatus是这样的:
<div class="loginStat">
<asp:LoginStatus ID="HeadLoginStatus" runat="server" LogoutAction="Redirect" LoginImageUrl="~/images/Key-icon.png"
LogoutImageUrl="~/images/LogOut32.png" LogoutPageUrl="~/" ToolTip="Log in/out" />
</div>
Run Code Online (Sandbox Code Playgroud) 我有两个 .NET Web 应用程序在同一台服务器上运行 - sentinel(托管在https://sentinel.mydomain.com/)和fortknox(在http://www.mydomain.com/fortknox)
Sentinel 是一个身份验证“门户”。FortKnox 是一个“概念证明”应用程序,它使用表单身份验证,但将 loginUrl 设置为https://sentinel.mydomain.com/login(以及一个特殊的 Application_EndRequest 处理程序来限定 ReturnUrl)。Sentinel 是使用 MVC 4 和 Razor 用 .NET 4.0 编写的;FortKnox 是使用 .NET 2.0 的 ASP.NET MVC 2。
我正在使用 ASP.NET FormsAuthentication 并将 cookie 域设置为 ,.mydomain.com以便设置 的 cookiesentinel.mydomain.com将与请求一起发送到www.mydomain.com,反之亦然。cookie 部分运行良好- 两个应用程序都获得相同的 .ASPXAUTH 加密表单票证。
问题是,在我们的生产服务器上,fortknox无法解密由哨兵创建的cookie——即使它们具有相同的机器密钥。即使两个应用程序都在同一个物理盒子上运行,它也不起作用。
用户点击 fortknox,他们被重定向到哨兵,他们登录,设置了 cookie,他们被重定向回 fortknox,然后我得到“无法验证数据”:
Exception: Unable to validate data.
at System.Web.Configuration.MachineKeySection.EncryptOrDecryptData(Boolean …Run Code Online (Sandbox Code Playgroud) 我的 IIS 看起来像这样:
Sites ->
Default Web Site ->
MyWebApp
Run Code Online (Sandbox Code Playgroud)
那么问题是:如何在 MyWebApp 上启用表单身份验证?我设法更改或编辑匿名访问、基本和 Windows 身份验证。然而,Forms Auth 并不那么容易。如何在 Powershell 中执行此操作?
我可以这样读取设置:
(Get-WebConfiguration system.web/authentication 'IIS:\sites\Default Web Site\MyWebApp').Mode
我在 Set-Webconfiguration 或 Set-Webconfigurationproperty 方面遇到麻烦或没有运气。我发现这些 cmdlet 很难弄清楚。
更改发生在 web.config 中,至少当我在 IIS 管理器中点击“启用”或“禁用表单身份验证”时,web.config 会更新。任何线索和提示都将受到高度赞赏。
首先,我使用 cookie 容器创建了 HttpClientHandler
CookieContainer cookies = new CookieContainer();
HttpClientHandler handler = new HttpClientHandler();
handler.CookieContainer = cookies;
handler.UseCookies = true;
var hc = new HttpClient(handler);
Run Code Online (Sandbox Code Playgroud)
然后我点击 Base Url 只是为了获取带有“__RequestVerificationToken”的 cookie
string r = await hc.GetStringAsync(BaseUrl);
Run Code Online (Sandbox Code Playgroud)
然后我将用户名/密码发布到登录网址
HttpContent content = new FormUrlEncodedContent(new[]
{
new KeyValuePair<string, string>("UserName", "admin"),
new KeyValuePair<string, string>("Password", password),
});
HttpResponseMessage response = await hc.PostAsync(LoginUrl, content);
Run Code Online (Sandbox Code Playgroud)
然后我收到服务器错误“所需的防伪表单字段“__RequestVerificationToken”不存在”。
但是当我在fiddler中检查请求时,我可以看到“__RequestVerificationToken”已经添加到请求的cookie中。
然后我尝试在IE中手动登录,并检查IE发送的请求类型。
然后我发现IE也在表单中放入了“__RequestVerificationToken”,所以我在表单中添加了cookie
new KeyValuePair<string, string>("__RequestVerificationToken", cookies.GetCookies(new Uri(BaseUrl)).Cast<Cookie>().FirstOrDefault(x => x.Name == "__RequestVerificationToken").Value)
Run Code Online (Sandbox Code Playgroud)
然后我得到了这个错误
“所提供的防伪令牌验证失败。cookie“_RequestVerificationToken ”和表单字段“ _RequestVerificationToken”已交换。”
然后我在谷歌上找不到这个错误的任何搜索结果。
任何想法?
谢谢
forms-authentication httpclient antiforgerytoken windows-store-apps
我有一个 asp.net 应用程序,它当前正在使用带有 SlideExpiration="true" 的表单身份验证。在 web.config 中,我们有以下内容:
<authentication mode="Forms">
<forms loginUrl="Mylogin.aspx" timeout="15" slidingExpiration="true"/>
</authentication>
Run Code Online (Sandbox Code Playgroud)
这完全符合规范:有一个 15 分钟的滑动到期时间。但是,我们现在有一个新的安全要求:用户必须每 24 小时重新进行一次身份验证,即使他们一直处于“活跃”状态。换句话说,即使您在登录后的 24 小时内每分钟点击一次网站中的链接,24 小时后,您也会自动退出并重定向到登录页面。
但slidingExpriation 仅是真/假。据我所知,没有“两者”功能(例如,有slidingExpirationTimeout="15" 和absoluteExpirationTimeout="1440")。
除了滚动我自己的解决方案,有没有办法使用内置的表单身份验证来实现这一点?
提前致谢。
如何在asp.net mvc中关闭表单身份验证。我具有旨在进入Web应用程序的注册,登录和忘记密码页面。最初我
我目前将asp.net mvc Web应用程序托管为单个代码库和多个数据库格式。我遇到表单在一段时间内过期的情况,而logon.aspx页面出现在主页的中间。我发现这是因为以下代码:
webconfig:
<authentication mode="Forms"><forms timeout="180000" slidingExpiration="false"/></authentication>
logon.cshtml:
FormsAuthentication.SetAuthCookie(user.UserName, false);
return RedirectToAction("Index", "Home");
Run Code Online (Sandbox Code Playgroud)
我不希望我的用户会话或表单在他们注销之前过期。如何删除身份验证模式或如何解决此超时问题?请帮忙。
这是我完整的webconfig代码:
<system.web>
<customErrors mode="Off" />
<globalization uiCulture="en-AU" culture="en-AU" />
<!--<sessionState mode="InProc" />-->
<sessionState timeout="1500"></sessionState>
<httpRuntime encoderType="AntiXssEncoder, OnlineAB" />
<compilation debug="true" targetFramework="4.0">
<assemblies>
<add assembly="System.Data.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
</assemblies>
</compilation>
<authentication mode="Forms">
<forms timeout="180000" slidingExpiration="false"/>
</authentication>
<membership>
<!--<providers>
<clear />
<add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="ApplicationServices" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" applicationName="/" />
</providers>-->
</membership>
<profile>
<!--<providers>
<clear />
<add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider" …Run Code Online (Sandbox Code Playgroud) 我正在尝试跨多个ASP.NET MVC Web应用程序进行共享身份验证.这些应用有不同的子域名,例如xxample.com,y.example.com.我已经生成了一个机器密钥并将其添加到了应用程序的web.config中.我已将域属性添加到forms标记(domain ="example.com").
这似乎在Chrome中正常运行.登录到第一个应用程序后,我导航到第二个应用程序,不需要登录.但是,在Firefox中,它似乎打破了登录.当我单击登录按钮时,Firefox似乎很快重新加载登录页面.我无法登录.
什么可能导致这种行为?是否有关于使用此域名编写的cookie,Firefox不喜欢?
asp.net-mvc ×3
asp.net ×2
c# ×2
iis ×2
firefox ×1
httpclient ×1
ldap ×1
machinekey ×1
openldap ×1
powershell ×1
ssrs-2008 ×1
timeout ×1
web-config ×1