2013-08-25 126 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 
相關問題