根据我的书,如果启用了角色管理,则RoleManagerModule通过将RolePrincipal对象分配给用户来创建用户的安全上下文HttpRequest.User.但是,是否已经创建了安全上下文(因此主要对象被分配HttpContext.User)FormsAuthenticationModule,在被调用之前RoleManagerModule调用它?
我问这个,因为在下面的代码中,主要对象HttpRequest.User已分配给已存在,即使RoleManagerModule尚未被调用:
protected void Application_AuthenticateRequest(Object sender, EventArgs e)
{
if (User.Identity.IsAuthenticated && Roles.Enabled)
{
//here we subscribe user to a role via Roles.AddUserToRole()
}
}
Run Code Online (Sandbox Code Playgroud)
主要对象是由对象(由创建者)创建FormsAuthenticationModule和分配给HttpRequest.User后来替换的?RolePrincipalRoleManagerModule
我最近开始使用ASP.NET Forms Authentication和Membership.
我在Visual Studio中创建了一个C#项目,它自动创建了像"/Account/Login.aspx"这样的页面.
然后我按照一个示例将aspnet_*表安装到我的SQL Server数据库,并且我已经能够使用该<asp:CreateUserWizardStep>控件来创建用户.
我之后能够以此用户身份登录,并在调用时显示登录的用户名 <asp:LoginName>
但是,当我在C#代码中调用以下内容时,在Button Click事件处理程序中,我总是得到一个Null引用异常:
string UserID = Membership.GetUser().ProviderUserKey.ToString();
Run Code Online (Sandbox Code Playgroud)
这不应该UserID从我的aspnet_users表中返回吗?
如果<asp:LoginName>显示UserName值,我不应该总是能够调用Membership.GetUser().ProviderUserKey
我现在在业余时间在几个ASP.Net MVC项目之间交替,我注意到它们之间的表单身份验证"溢出".即我做一些工作来投射并登录以测试一些功能.然后我切换到项目b,当我启动时,我已经登录,因为项目的登录仍然被浏览器和我的本地IIS Express记住.
有什么办法可以防止这种情况发生吗?
我有Windows Identity Foundation与MVC 3配合良好.但是,在MVC 4中,似乎WIF没有机会处理未授权的响应并重定向到STS - 而是我被重定向到login.aspx,这是很好的老表格认证.
在MVC 3中,我曾经在web.config中禁用表单auth,但它在MVC 4中不起作用.
我知道MVC 4中的身份验证和授权已经发生了变化,但是我的Google技能似乎已经让我感到厌烦,而且我似乎无法找到如何阻止表单身份验证干扰.有什么指针吗?
登录
[HttpPost]
public ActionResult Login(LoginModel loginModel)
{
if (ModelState.IsValid)
{
using (var _Db = new AccountContext())
{
var _UserAccount = _Db.UserAccounts.FirstOrDefault(u => u.Username == loginModel.Username && u.Password == loginModel.Password);
if (_UserAccount == null)
{
ModelState.AddModelError("", "Account doesn't exist!");
}
else
{
FormsAuthentication.SetAuthCookie(loginModel.Username, false);
}
}
}
return RedirectToAction("Index", "Home");
}
Run Code Online (Sandbox Code Playgroud)
重定向或显示视图
public ActionResult Index()
{
if (HttpContext.User.Identity.IsAuthenticated)
{
return View("Index");
}
else
{
return RedirectToAction("LoginPage");
}
}
Run Code Online (Sandbox Code Playgroud)
我已经完成了代码,可以看到使用正确的用户名调用SetAuthCookie.
FormsAuthentication.SetAuthCookie(loginModel.Username, false);
什么可以阻止用户进行身份验证?
在我的本地机器上我的表单身份验证工作正常,我可以使用服务器中保存的详细信息登录.如果我输入的密码错误,我没有登录,与用户名相同.
当我发布网站时,只要ModelState正确,我就可以使用任何细节登录.我不明白为什么在本地计算机上我的服务器会有不同的行为.
我正在使用相同的数据库,因此不能成为问题.当我发布项目时,就好像我的登录模型被完全忽略了一样.
知道为什么会这样吗?我是否需要在web.config中添加一些内容才能在我的服务器上运行?奇怪的是,这在过去的几个月里一直运作良好.
在我的ASP.NET MVC4应用程序中,我正在使用表单身份验证.应用程序中的一个视图需要通过jQuery post()调用获取一些字符串数据.我写了一个返回字符串的动作.一切正常,直到表单身份验证票证到期.到期后,对字符串操作的AJAX调用导致以下结果:
jqXHR.done()而不是jqXHR.fail()这是预期的行为吗?我能做些什么来让动作返回401吗?或者我还应该做些什么来处理这个问题?
我正在使用FormsAuthentication编写ASP.net MVC 5应用程序.我把所有东西都搞定了并正常使用FormsAuthentication.SetAuthCookie(user.Email, model.RememberMe).
但是,我想创建一个自定义票证,以便我可以在票证的UserData字段中存储一些额外的信息.这就是我创建票证并将其存储在cookie中的方式:
var ticket = new FormsAuthenticationTicket(1, user.Email, DateTime.Now, DateTime.Now.AddMinutes(FormsAuthentication.Timeout.Minutes), model.RememberMe, user.AuthToken);
var encryptedTicket = FormsAuthentication.Encrypt(ticket);
var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket) { Domain = FormsAuthentication.CookieDomain, Path = FormsAuthentication.FormsCookiePath, HttpOnly = true, Secure = FormsAuthentication.RequireSSL };
HttpContext.Response.Cookies.Add(cookie);
Run Code Online (Sandbox Code Playgroud)
这会创建一个加密的票证并将其发送到浏览器.我已经使用开发人员工具和Fiddler验证了该票证是否存在于浏览器中,并且在后续请求中将其发送回服务器.
但身份验证现在已被破坏.此外,cookie不可用于Application_AuthenticateRequest或Application_PostAuthenticateRequest事件中.当我使用调试器进行探索时,Context.Request.Cookies它不在列表中.
奇怪的是,如果我退回管道并检查它,cookie确实存在Application_BeginRequest:
void Application_BeginRequest(object sender, EventArgs e)
{
// Auth cookie exists in the collection here! Ticket decrypts successfully
HttpCookie authCookie = HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName];
if (authCookie == null)
return;
var …Run Code Online (Sandbox Code Playgroud) 我有一个Owin Identity应用程序和另一个在虚拟目录中设置的应用程序.虚拟应用程序使用传统的表单身份验证进行设置,并且两个Web.configs都具有相同的<machineKey>设置.我可以使用Identity应用程序登录,并可以看到生成的cookie.但是,当我尝试访问虚拟应用程序时,它说我没有通过身份验证.
在Identity应用程序中,我有以下设置:
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/login.aspx"),
Provider = new CookieAuthenticationProvider
{
// Enables the application to validate the security stamp when the user logs in.
// This is a security feature which is used when you change a password or add an external login to your account.
OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
validateInterval: TimeSpan.FromMinutes(30),
regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
}
});
Run Code Online (Sandbox Code Playgroud)
在虚拟应用程序中,我的授权设置如下:
<authorization>
<deny users="?" />
</authorization>
Run Code Online (Sandbox Code Playgroud)
是否有任何指针让虚拟应用程序识别Identity设置的cookie?
我必须在登录时设置FormsAuthenticationcookie值(FormsAuthentication.SetAuthCookie(UserDesignation, false)).现在我需要提供指定更改选项.因此,当用户更改其名称时,我需要将FormsAuthenticationcookie值从旧指定更新为新指定.
有可能吗?
如果是的话,我该怎么做?
cookies asp.net-mvc forms-authentication setcookie formsauthentication