我们使用MVC 3.默认用户管理对我们不可用,因为我们的帐户信息存储在我们自己的数据存储中,并且访问通过我们自己的存储库类进行。
我正在尝试将主要添加角色分配给HttpContext.User并发出授权cookie。
基于代码剪切,我发现我尝试过这样的事情:
if (UserIsOk(name, password))
{
HttpContext.User =
new GenericPrincipal(
new GenericIdentity(name, "Forms"),
new string[] { "Admin" }
);
FormsAuthentication.SetAuthCookie(name, false);
return Redirect(returnUrl);
}
当下一个请求完成后,用户将通过身份验证,但他不处于“管理员”角色。 我错过了什么?
答案 0 :(得分:0)
我认为你应该实现 FormsAuthenticationTicket 。 更多信息:http://msdn.microsoft.com/en-us/library/aa289844(v=vs.71).aspx
在Mvc中它非常相似。
我有一个名为UserSession的类,它被注入到LoginController中,我在LogOn操作中使用:
[HttpPost, ValidateAntiForgeryToken]
public ActionResult Index(LoginInput loginInput, string returnUrl)
{
if (ModelState.IsValid)
{
return (ActionResult)_userSession.LogIn(userToLog, loginInput.RememberMe, CheckForLocalUrl(returnUrl), "~/Home");
}
}
这是我的UserSession LogIn实现(注意我将“Admin”角色硬编码为示例,但您可以将其作为参数传递):
public object LogIn(User user, bool isPersistent, string returnUrl, string redirectDefault)
{
var authTicket = new FormsAuthenticationTicket(1, user.Username, DateTime.Now, DateTime.Now.AddYears(1), isPersistent, "Admin", FormsAuthentication.FormsCookiePath);
string hash = FormsAuthentication.Encrypt(authTicket);
var authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, hash);
if (authTicket.IsPersistent) authCookie.Expires = authTicket.Expiration;
HttpContext.Current.Response.Cookies.Add(authCookie);
if (!String.IsNullOrEmpty(returnUrl))
return new RedirectResult(HttpContext.Current.Server.UrlDecode(returnUrl));
return new RedirectResult(redirectDefault);
}
然后在基本控制器中我重写了OnAuthorization方法来获取cookie:
if (filterContext.HttpContext.Current.User != null)
{
if (filterContext.HttpContext.Current.User.Identity.IsAuthenticated)
{
if( filterContext.HttpContext.Current.User.Identity is FormsIdentity )
{
FormsIdentity id = filterContext.HttpContext.Current.User.Identity as FormsIdentity;
FormsAuthenticationTicket ticket = id.Ticket;
string roles = ticket.UserData;
filterContext.HttpContext.Current.User = new GenericPrincipal(id, roles);
}
}
}
我希望这会有所帮助。让我知道。
答案 1 :(得分:0)
您确定,这些角色已启用,并且有这样的角色吗?
如果没有,请执行以下操作: 在Visual Studio中: 项目 - > ASP.NET配置
然后选择安全性,启用角色。创建角色“Admin”。
然后尝试你的方法