2013年6月29日 星期六

在ASP.NET MVC4使用預設的User Roles

新增一個網際網路應用程式,打開 AccountController並看看註冊action
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult Register(RegisterModel model)
{
    if (ModelState.IsValid)
    {
     // 嘗試註冊使用者
        try
        {
            WebSecurity.CreateUserAndAccount(model.UserName, model.Password);
            WebSecurity.Login(model.UserName, model.Password);
            return RedirectToAction("Index""Home");
        }
        catch (MembershipCreateUserException e)
        {
            ModelState.AddModelError("", ErrorCodeToString(e.StatusCode));
            }
        }

        // 如果執行到這裡,發生某項失敗,則重新顯示表單
        return View(model);
}

這裡少了對新的使用者指派腳色設定,在 WebSecurity.CreateUserAndAccount() 後面加入
if (!Roles.RoleExists("user"))
{
    Roles.CreateRole("user");
}
Roles.AddUserToRole(model.UserName, "user");

之後可以再Action上面加入
[Authorize(Roles = "admin")]

或是在程式或是View裡面判斷
if (Roles.IsUserInRole("admin")){}

---------------------------------------------------------

當在別的Controller裡面的Action加入[Authorize(Roles = "admin")] 會出現錯誤 :
建立連接至 SQL Server 時,發生網路相關或執行個體特定的錯誤。找不到或無法存取伺服器。確認執行個名稱是否正確,以及 SQL Server 是否設定為允許遠端連線。 (provider: SQL Network Interfaces, error: 26 - 搜尋指定的伺服器/執行個體時發生錯誤)

因為使用SimpleMembership的資料庫還未初始化,可以在Controller上加入 
[InitializeSimpleMembership] 即可(預設只有AccountController有加入該屬性)

或是想要在應用程式啟動時就初始化可以在Global.asax 加入
WebSecurity.InitializeDatabaseConnection("DefaultConnection""UserProfile""UserId""UserName", autoCreateTables: true);

如果指示發生錯誤在:
// 請確定一個應用程式啟動只起始一次 ASP.NET Simple Membership
LazyInitializer.EnsureInitialized(ref _initializer, ref _isInitialized, ref _initializerLock);

頁面顯示錯誤訊息為:
"WebSecurity.InitializeDatabaseConnection" 方法只能呼叫一次。

將該檔案(Filters/InitializeSimpleMembershipAttribute.cs)內的WebSecurity.InitializeDatabaseConnection()方法移除

---------------------------------------------------------
取的目前使用者的角色(陣列)
string[] roles = Roles.GetRolesForUser()

判斷角色
bool isAdmin = Roles.IsUserInRole("admin")


沒有留言: