0

我工作在ASP.NET MVC 5的Web API 2如何使用角色與集成Windows身份驗證

我已通過添加以下代碼來實現網絡集成Windows身份驗證實現的Web應用程序。 config:

<system.web> 
    <authentication mode="Windows" /> 
</system.web> 
<system.webServer> 
    <security> 
    <authentication> 
     <windowsAuthentication enabled="true"/> 
    </authentication> 
    </security> 
</system.webServer> 

並在我的控制器上添加[Authorize]註釋。

現在,我被要求根據用戶的角色提供一些功能。我有一張表,我擁有用戶權限,但我不知道如何創建這些角色,並將正確的權限與他們關聯。

任何幫助,將不勝感激。

在此先感謝

[更新]

基於梅森的回答,我已經更新了代碼位。

添加以下行的web.config:

<roleManager defaultProvider="MyRoleProvider"> 
    <providers> 
    <add 
     name="MyRoleProvider" 
     type="MyApp.App_Start.MyRoleProvider" 
     applicationName="My Tool" /> 
    </providers> 
</roleManager> 

MyRoleProvider.cs:

public class MyRoleProvider : RoleProvider 
{ 
    private MyEntities db = new MyEntities(); 

    public override void AddUsersToRoles(string[] usernames, string[] roleNames) 
    { 
     throw new NotImplementedException(); 
    } 

    public override string ApplicationName 
    { 
     get; 
     set; 
    } 

    public override void CreateRole(string roleName) 
    { 
     throw new NotImplementedException(); 
    } 

    public override bool DeleteRole(string roleName, bool throwOnPopulatedRole) 
    { 
     throw new NotImplementedException(); 
    } 

    public override string[] FindUsersInRole(string roleName, string usernameToMatch) 
    { 
     throw new NotImplementedException(); 
    } 

    public override string[] GetAllRoles() 
    { 
     throw new NotImplementedException(); 
    } 

    public override string[] GetRolesForUser(string username) 
    { 
     throw new NotImplementedException(); 
    } 

    public override string[] GetUsersInRole(string roleName) 
    { 
     throw new NotImplementedException(); 
    } 

    public override void RemoveUsersFromRoles(string[] usernames, string[] roleNames) 
    { 
     throw new NotImplementedException(); 
    } 

    public override bool IsUserInRole(string username, string roleName) 
    { 
     vUser user = db.vUsers.Where(u => u.UserName == username).First(); 
     if (roleName == "User") 
     { 
      if (user.IsAllowedToView == true) 
      { 
       return true; 
      } 
      else 
      { 
       return false; 
      } 
     } 
     else if (roleName == "Administrator") 
     { 
      if (user.IsAllowedToSubmit == true) 
      { 
       return true; 
      } 
      else 
      { 
       return false; 
      } 
     } 
     else 
     { 
      return false; 
     } 
    } 

    public override bool RoleExists(string roleName) 
    { 
     if (roleName == "User" || roleName == "Administrator") 
     { 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
    } 
} 

當我使用我的控制器[Authorize]註釋,並調用HttpContext.Current.User.Identity.Name返回該我用的ID登錄到我的機器。 (AD的一部分)但是,如果我使用[Authorize(Roles =「User」)],它會一再詢問我的用戶名和密碼,並且不接受任何內容。我把斷點放在MyRoleProvider類的每一個方法上,但是程序並沒有停下來,這讓我覺得它甚至不會調用提供者。

+1

看到我的答案[here](http://stackoverflow.com/a/32590333/1139830)。您只需要繼承一個類,連接方法以從表中提取適當的數據,然後就可以開始在應用程序中使用這些角色。 – mason

+0

@mason感謝您將我引導至該帖子。我已經實現了角色管理器,並添加到了我的web.config中。我現在的問題是我如何將用戶ID傳遞給角色管理器。我在控制器的頂部有'[Authorize(Roles =「User」)]',但它不允許我查看它。如何將用戶名參數傳遞給public override bool IsUserInRole(string username,string roleName)? – Jail

+0

你不需要。當我們在web.config中註冊我們的角色管理器時,就像我在答案中顯示的那樣,系統意識到了這一點。如果您要查看該「Authorize'屬性的源代碼,您將看到它代表您正在調用註冊角色管理器(如果您想驗證,請在角色管理器中設置斷點)。因此,您無需手動獲取用戶名並將其傳遞給角色管理員。但是,如果你確實需要用戶名,出於其他原因,這來自'HttpContext.Current.User.Identity.Name'。 – mason

回答

0

通過每個控制器或甚至控制器內的每個方法,您可以添加自己的自定義授權角色。

[Authorize(Roles="Admin,Doctor")] 
    public class Investigation : Controller 
    { 

    } 

注: 中的角色必須寫它插入到數據庫中以同樣的方式(案例靈敏)

0

如果您希望管理Active Directory中的角色,你總是可以創建Active Directory用戶然後在控制器上使用[Authorize(Roles="{AD_GROUP_NAME}")]註釋。

+0

這要求您成爲域管理員,或者與域管理員進行合作。雖然它適用於某些情況,但它絕對不適用於所有情況,特別是不適用於這種情況,因爲他已經擁有一個包含該信息的數據庫。 – mason

+0

同意。只是提供一個可能的選擇。 –

0

在您的特定情況下(基於聊天),這聽起來像基於角色的概念不適合您,因爲您的權限存儲在用戶級別而不是角色級別,並且您不允許更改由於公司的限制,這是如何工作的。

相反,您應該write your own filter,您可以將其應用於您的操作方法。該過濾器應該可能實施IAuthorizationFilter。這將允許你這樣做:

[RequirePermissions("Save")] 
public ActionResult Save(Data date) 
{ 
    Database.Save(data); 
    return View("Success"); 
} 

和驗證用戶有權限應該抽象出一個共同的類,這樣你也可以重用的觀點邏輯可能的邏輯。

0
 public override string[] GetRolesForUser(string username) 
     { 
      var userrole = from role in db.roles 
          where username == role.userID 
          select role.role1; 
      if (userrole != null) 
       return userrole.ToArray(); 
      else 
       return new string[] { }; 
      //throw new NotImplementedException(); 
     } 

這個功能應該被編輯。

+0

您能詳細解釋一下您提供的解決方案嗎? – abarisone

+0

我在MyRoleProvider.cs中編輯這個函數,然後它可以工作!當它運行時,我不需要輸入我的用戶名和密碼:) – user6218863

相關問題