我有一个带有自定义会员资格的c#mvc razor网络应用程序,一切都很棒。
我可以使用以下命令获取登录的用户名:user.identity.name
。
我有一个用户名及其角色的数据库。
现在问题是,在我的一个观点中,我试图限制只能访问“admin”
所以我尝试使用user.isinrole
但是,这总是返回false。
所以我尝试使用roles.isuserinrole
,然后我得到一个说明未启用的异常。
我在Google周围找到了几个具有函数isuserinrole
的角色提供程序的自定义控制器。
我的问题是,我是否需要为isuserinrole
创建自定义控制器?
在我看来,当我输入roles.
- > visual studio列出了具有isuserinrole
的内置函数列表,所以我的问题是,创建我自己的自定义角色提供程序会覆盖内置函数吗?
假设我有自定义功能,我的Web应用程序将如何将其全部绑定并检查用户是否在角色中?
提前感谢您的回复。
答案 0 :(得分:2)
尝试创建自定义角色提供程序。 This page on MSDN进入了基础。
自定义角色提供程序应继承自抽象类System.Web.Security.RoleProvider
。在此类中,您可以实现抽象方法IsUserInRole(string username, string roleName)
,以根据应用程序需求提供正确回答IsUserInRole
调用所需的逻辑。
答案 1 :(得分:0)
您可以将[Authorize(Roles = "Admin")]
属性添加到您的操作或控制器。
答案 2 :(得分:0)
你可以简单地覆盖界面,使用类似的东西
[HttpPost]
public ActionResult Login(MVVMLogin LoginData)
{
//validate user against database
var IsValid = true;
if (IsValid == true)
{
var Roles = "admin";
var authTicket = new FormsAuthenticationTicket(
1,
LoginData.Username,
DateTime.Now,
DateTime.Now.AddMinutes(20), //Expires
false,
Roles,
"/");
var cookie = new HttpCookie(FormsAuthentication.FormsCookieName,FormsAuthentication.Encrypt(authTicket));
Response.Cookies.Add(cookie);
}
return View();
}
并在global.asax中添加以下内容
protected void Application_AuthenticateRequest(Object sender, EventArgs e)
{
if (HttpContext.Current.User == null) return;
if (!HttpContext.Current.User.Identity.IsAuthenticated) return;
if (!(HttpContext.Current.User.Identity is FormsIdentity)) return;
var id = HttpContext.Current.User.Identity as FormsIdentity;
var ticket = id.Ticket;
var userData = ticket.UserData;
var roles = userData.Split(new[] { ',' });
HttpContext.Current.User = new GenericPrincipal(id, roles);
}
现在您可以控制哪种类型的用户可以访问控制器
[Authorize(Roles = "admin,user")]
public class CampaignsController : Controller