2013-08-25 98 views
2

我有一个c#mvc剃须刀web应用程序与自定义会员资格,一切都很好。 我能够通过使用此登录用户名:user.identity.name。 我有一个用户名和他们的角色的数据库。 现在的问题是,在我的意见之一,我试图限制只有“管理员” 访问,所以我尝试使用user.isinrole但是,这总是返回false。 所以然后我尝试使用roles.isuserinrole,然后我得到一个异常,说它没有启用。user.isuserinrole的自定义角色提供者mvc

我谷歌周围,并找到几个自定义控制器的角色提供商有功能isuserinrole

我的问题是,我需要创建一个自定义控制器isuserinrole被启用? 在我看来,当我输入roles. - > visual studio列出的内置函数列表有isuserinrole,所以我的问题是,将创建我自己的自定义角色提供程序覆盖内置函数?

假设我有自定义函数,我的web应用程序如何将它全部绑定并检查用户是否在角色中?

在此先感谢您的回复。

回答

2

尝试创建一个自定义角色提供程序。 This page on MSDN进入基础。

自定义角色提供者应该继承抽象类System.Web.Security.RoleProvider。在此课程中,您可以实现抽象方法IsUserInRole(string username, string roleName),以提供根据您的应用程序需要正确回答IsUserInRole调用所需的逻辑。

+0

这正是我的想法! – NULL

0

您可以将[Authorize(Roles = "Admin")]属性添加到您的操作或控制器。

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 
相关问题