我有以下路线:
{语言}/{控制器} .mvc/{动作}/{ID}
一旦用户选择了语言,它就会以路由值语言进行维护.
HTTP://本地主机:4000 /德/ Account.mvc /注册
如果用户点击需要修改的页面,我会遇到问题.然后他被重定向到http:// localhost:4000/Account.mvc/Login?ReturnUrl =%2fde%2fAccount.mvc%2fProfileData
登录页面在web.config中配置,不允许路由中的参数.登录后的页面正常(http:// localhost:4000/de/Account.mvc/ProfileData),但登录页面本身没有路由值语言.
我怎样才能解决这个问题?
编辑
我使用了Darin的答案,但必须包含原始Authorize过滤器(AuthorizeAttribute.cs)中的所有代码.原因记录在该文件中.它处理未经授权的用户可能从缓存中获取安全页面的情况.
以下是代码中的注释:
// ** IMPORTANT **
// Since we're performing authorization at the action level, the authorization code runs
// after the output caching module. In the worst case this could allow an authorized user
// to cause the page to be cached, then an unauthorized user would later be served the
// cached page. We work around this by telling proxies …Run Code Online (Sandbox Code Playgroud) 我公司有一个很大的应用程序,我们正在完成.它利用WCF作为Active Directory的骨干进行身份验证.这适用于两个站点之一,因为身份验证模型是Windows,您必须成为域的一部分才能登录该站点.我的问题涉及外部可访问的其他站点.它为具有特定用户/传递的代理调用设置ClientCredentials.Windows.ClientCredential以模拟AD用户,因此完整的安全模型可以正常工作.这一切都完全符合预期.
我的问题是,在网上我可以使用HttpContext.Current.User.Identity.Name从Forms身份验证部分获取当前登录的用户,但要做到这一点,我必须确保存在一个System.Web引用我目前正在使用的DLL.我们的基础对象来自一个不了解System.Web的简单类.有没有办法找出在该基础对象项目中登录的Forms用户?我尝试过System.Security.Principal,但这只能让我从我能说的内容中访问Windows帐户,并且不会对我有任何帮助.
我知道一个选项只是引用System.Web并完成它,但这听起来真的很麻烦,而不是最好的选择,所以我希望在这里提供一些技巧.
我有一个使用表单身份验证的ASP.NET Web应用程序.在web.config中,窗体身份验证超时值设置为"20"(我理解为20分钟).
我们正在看到一个问题,您将与该网站进行交互..(即点击链接按钮,执行回发等)并随机发送回登录页面进行身份验证.
似乎超时被遵守,但活动没有重新启动计数器.
任何想法在哪里查看或如何调试?
我的要求是只能从匿名用户访问登录页面和注册页面.我使用VS2008中的默认模板创建了一个新的ASP.NET MVC项目.
之后,我启用了将此部分添加到Web配置的安全性:
<authorization>
<deny users="?" />
</authorization>
Run Code Online (Sandbox Code Playgroud)
现在,由于启用了安全性,因此无法再访问"注册操作".我如何才能禁用该Action的安全性?
谢谢
我使用表单身份验证在我的网站上创建了一个登录,我不明白为什么在创建故障单并将其添加到cookie之后
如果我检查 HttpContext.Current.Request.IsAuthenticated
我弄错了.仅在连续请求时,用户才能进行身份验证
这是我的代码
var fat = new FormsAuthenticationTicket(
1,
username,
DateTime.Now,
DateTime.Now.AddMinutes(20),
rememberMe,
contact.Id + "," + contact.Role.Id,
FormsAuthentication.FormsCookiePath);
HttpContext.Current.Response.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(fat)));
Run Code Online (Sandbox Code Playgroud)
在这一点,如果我检查HttpContext.Current.Request.IsAuthenticated我得到假,我认为这一点用户被认证...
这是我的配置
<authentication mode="Forms">
<forms loginUrl="/Admin/Login.aspx" name="FormAuthentication" />
</authentication>
<authorization>
<deny users="?"/>
</authorization>
Run Code Online (Sandbox Code Playgroud)
谢谢.
我正在开发一个MVC 3项目,并希望在注册时使用表单身份验证将用户添加到角色.因此,我想创建一些复选框,或者显示角色的下拉列表,这些列表已被选中,并且用户在注册时被分配给角色.
到目前为止我有这个代码,它有效:
public ActionResult Register()
{
ViewData["roleName"] = new SelectList(Roles.GetAllRoles(), "roleName");
return View();
}
Run Code Online (Sandbox Code Playgroud)
在我看来,我有:
<label for="roleName">Select Role:</label>
@Html.DropDownList("roleName")
@Html.ValidationMessage("roleName")
Run Code Online (Sandbox Code Playgroud)
这是控制器的HttpPost部分,这是我不知道编码的部分:
[HttpPost]
public ActionResult Register(RegisterModel model)
{
if (ModelState.IsValid)
{
// Attempt to register the user
MembershipCreateStatus createStatus;
Membership.CreateUser(model.UserName, model.Password, model.Email, null, null, true, null, out createStatus);
if (createStatus == MembershipCreateStatus.Success)
{
FormsAuthentication.SetAuthCookie(model.UserName, false /* createPersistentCookie */);
return RedirectToAction("Index", "Home");
}
else
{
ModelState.AddModelError("", ErrorCodeToString(createStatus));
}
}
// If we got this far, something failed, redisplay form
return View(model); …Run Code Online (Sandbox Code Playgroud) 我正在使用相同的域但不同的子域在.NET 2.0站点和.NET 4.0站点之间进行SSO.在一台机器上的开发环境中一切正常,但我无法让4.0生产站点接受2.0生产站点生成的auth cookie.这两个站点位于不同的服务器上,一个运行IIS 6,只安装了2.0框架,另一个运行IIS 7.5,安装了4.0框架.我已经阅读了其他问题的所有其他答案,这些问题指出了<machineKey>元素和<authentication><forms>元素的问题,并且相信我,所有这些东西都已正确设置,并且所有4个站点都具有与这些元素完全相同的属性值.
起初我认为这是加密的一个问题,但是当我仔细研究Fiddler发生了什么时,我发现auth cookie正在请求中正确传递,但似乎在某些时候消失了,然后不是可在Request.Cookies集合中找到.
4.0生产站点位于负载均衡器后面,但Web场中当前没有其他服务器联机.负载均衡器能否以某种方式丢弃cookie?cookie是否未添加到Request.Cookies集合中,因为它不是有效的身份验证cookie?如果是这样,为什么它不合法?
总而言之,当我在请求的页面上执行以下操作时:
HttpCookie AuthCookie = Request.Cookies.Get(".SSOAUTH");
AuthCookie为null,即使我可以在Fiddler的请求标头中看到具有该名称的cookie.
asp.net forms-authentication .net-4.0 .net-2.0 single-sign-on
我正在研究一个MVC3项目,我必须添加一个登录机制.我必须使用这种<authentication>方法.我以为这会自动将用户重定向到登录页面?但什么都没发生.
我在我的web.config文件中有这个:
<authentication mode="Forms">
<forms loginUrl="~/Account/LogOn" timeout="2880" />
</authentication>
Run Code Online (Sandbox Code Playgroud)
但我的登录控制器不会自动调用.我需要做些什么才能让它按照我想要的方式工作?
我的ASP.NET应用程序管理两个cookie:由FormsAuthentication发布和管理的标准auth cookie,以及另一个允许使用非Windows/ASP.NET系统进行单点登录的cookie.
ASP.NET应用程序配置为通过web.config启用auth cookie的滑动过期:
<authentication mode="Forms">
<!-- forms attributes removed for brevity -->
<forms name=".ASPXAUTH" slidingExpiration="true" />
</authentication>
Run Code Online (Sandbox Code Playgroud)
不幸的是,滑动过期只会更改auth cookie而不是SSO cookie.是否有我可以订阅的事件,以便在auth cookie的到期时间延长时通知我?
或者,我是否可以通过拦截对应用程序的每个有效请求并手动扩展cookie来模拟此行为?如果是这样,我必须实施哪种方法来拦截任何控制器的此类请求?
在这个标题之后,在我的web.config中,它由VS 2012生成.
现在,我不知道我把下面的代码放在web.config中我看到有人把它放进去<system.web>但是在我的web.config中它只有<system.web.webPages.razor>和<system.webServer>.当我把这个代码放在web.config中的某处时,我收到一个错误<authentication mode="Forms">:
有代码:
<authentication mode="Forms">
<forms loginurl="~/Comfirm/Login" timeout="2880"></forms>
</authentication>
Run Code Online (Sandbox Code Playgroud)