2013-02-23 153 views
0

我很困惑如何在我的asp.net MVC4剃鬚刀項目中使用角色。 這兩者之間有什麼區別,主要是,我如何使用authorize屬性,並使其在我檢查經過身份驗證的用戶的角色時進入我的自定義角色提供程序。還是我在這裏混合了一些東西?角色提供者和System.Web.Security.Roles

更具體的:

我有一個管理控制器,其中的角色爲「管理員」用戶可以做CRUD的東西。 在我控制我應用以下屬性:

[Authorize(Roles = "administrator")] 
public class OverviewController : Controller 

它是正確的假設,該授權屬性將用我的custome角色提供程序在後臺?如果是這樣,爲什麼它不適合我?我的自定義角色提供一流的

配件:

public sealed class CustomRoleProvider : RoleProvider 
{ 
    public override void Initialize(string name, NameValueCollection config) 
    { 
     if (config == null) throw new ArgumentNullException("config"); 

     if (name.Length == 0) name = "CustomRoleProvider"; 

     if (String.IsNullOrEmpty(config["description"])) 
     { 
      config.Remove("description"); 
      config.Add("description", "Custom Role Provider"); 
     } 

     //Initialize the abstract base class. 
     base.Initialize(name, config); 

     _applicationName = Helpers.GetConfigValue(config["applicationName"], System.Web.Hosting.HostingEnvironment.ApplicationVirtualPath); 
    } 

    public override bool IsUserInRole(string email, string roleName) 
    { 
     bool isValid = false; 

     var usersInRole = _unitOfWork.UsersRepository.Get(uir => uir.email == email && uir.Roles.Name == roleName); 

     if (usersInRole != null) isValid = true; 

     return isValid; 
    } 

我在做什麼不正確?如何用戶,當他或她是否正確授權,像這樣:

[HttpPost] 
    [AllowAnonymous] 
    [ValidateAntiForgeryToken] 
    public ActionResult LoginValidate(Authentication authentication, string returnUrl) 
    { 
     string email = authentication.email; 
     string password = authentication.password; 
     bool rememberMe = authentication.rememberMe; 
     if(string.IsNullOrEmpty(returnUrl)) returnUrl = "/"; 

     //If the filled in fields are validated against the attributes 
     if (ModelState.IsValid) 
     { 
      if (MembershipService.ValidateUser(email, password)) 
      { 
       FormsService.SignIn(email, rememberMe); 

       return RedirectToAction("Index", "Home", new { area="" }); 
      } 

      ModelState.AddModelError("", Resources.Resources.Error_incorrect_emailPassword); 

     } 

     // Add the ModelState dictionary to TempData here. 
     TempData["ModelState"] = ModelState; 

     return RedirectToAction("index", "Home", new { area="" }); 
    } 

從我的自定義角色提供對他或她的授權檢查?

編輯

我的web.config:

<roleManager enabled="true" defaultProvider="CustomRoleProvider" cacheRolesInCookie="true" > 
    <providers> 
    <clear /> 
    <add name="CustomRoleProvider" type="ArtWebShop.Common.CustomRoleProvider" connectionStringName="ArtWebshopEntities" applicationName="/" /> 
    </providers> 
</roleManager> 

    <membership defaultProvider="CustomMembershipProvider"> 
    <providers> 
    <clear /> 
    <add name="CustomMembershipProvider" type="ArtWebShop.Common.CustomMembershipProvider" connectionStringName="ArtWebshopEntities" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="0" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" applicationName="/" /> 
    </providers> 
</membership> 

編輯II

public override bool ValidateUser(string email, string password) 
    { 
     string salt = _unitOfWork.UsersRepository.GetSalt(email); 
     string hashedPassword = Helpers.CreatePasswordHash((password), salt); 

     return _unitOfWork.UsersRepository.UserIsValid(email, hashedPassword); 

    } 

回答

0

它是正確的假設,該授權屬性會用我的 custome角色提供者在後端?

是的。

如果是這樣,爲什麼它不適合我?

你可能忘了在你的web.config註冊這個自定義角色提供商,使其成爲該應用程序的默認提供:

<roleManager defaultProvider="CustomRoleProvider" enabled="true"> 
    <providers> 
     <clear /> 
     <add 
      name="CustomRoleProvider" 
      type="Somenamespace.CustomRoleProvider" 
     /> 
    </providers> 
</roleManager> 
+0

啊,NOP,忘了提,web.config文件應正確。我有你提供的相同結構。請參閱編輯。 – 2013-02-23 18:17:37

+0

然後這應該工作。還要確保你已經重寫了'GetRolesForUser'方法。 – 2013-02-23 18:17:59

+0

因此,如果我在方法IsUserInRole的自定義角色提供程序中放置斷點,並且將我的概述類頂部的授權屬性放置在它應該停止在那裏?每次需要將編輯II中的代碼放在控制器的頂部嗎? – 2013-02-23 18:21:23