0

我們有我們在ASP.NET開發5 Intranet站點又名vNext和MVC 6使用Windows身份驗證來獲得用戶ID與.net身份的角色管理

我們希望能夠得到用戶登錄的Windows網絡標識爲,但是現在的數據庫定義了角色等,我們將利用並已經這樣做。真的,我想要做的就是獲取Windows用戶標識,同時使用ASP.NET標識來管理用戶有權訪問的角色。任何建議如何做到這一點?

基本上Startup.cs我在配置服務類似如下:

services.AddIdentity<WorldUser, IdentityRole>(config => 
    { 
     config.User.RequireUniqueEmail = true; 
     config.Password.RequiredLength = 8; 
    }).AddEntityFrameworkStores<WorldContext>(); 

接下來在配置我:app.UseIdentity();

Windows驗證在項目屬性級別打開,Anonymous也是。我看不到實際獲得Windows用戶ID的方法。

+0

我要刪除我的答案,因爲它不起作用。但我不希望它看起來像是在推卸我的承諾,所以......一旦48小時的初始等待結束,我可以開始賞金,我將開始賞金並獎勵100分給第一個正確回答的人,答案是在獎金之前還是之後。 – AgapwIesu

+0

Brian,你看過這個http://stackoverflow.com/a/10584919/4843530。讓我知道是否有幫助,因爲我想嘗試解決它。似乎我們有一個非常相似的需求和問題。 – AgapwIesu

+0

對不起,我很早就錯過了。這是一個很好的想法,但在IIS Express下運行代碼,即代碼「var username = Thread.CurrentPrincipal.Identity.Name;」只是爲User Name返回一個空字符串。可能有辦法進入IIS Express配置文件以使其返回Windows ID。也會嘗試。 –

回答

0

警告:這是一個ASP.NET 4.5的代碼不是5

將這個是你的web.config:

<system.web> 
    <compilation debug="true" targetFramework="4.5" /> 
    <httpRuntime targetFramework="4.5" maxRequestLength="20480" /> 
    <authentication mode="Windows" /> 
    <authorization> 
     <deny users="?" />     <!--Denies access to the anonymous user.--> 
     <allow users="MydomainName\MyUsername" />  <!--Grants access to this user.--> 
     <allow roles="MyWindowsGroup" /> 
     <deny users="*" />     <!--Denies access to everyone. This shakes out as everyone except the defined users/usergroupt that are rganted access manualy.--> 
    </authorization> 
</system.web> 

這種方式,你必須有一個Windows網絡用戶ID。 Intranet應用程序中用戶始終擁有哪些內容。然後,只需使用:

HttpContext.Current.User.Identity.Name 

和以前一樣。就像這樣:

String name = User.Identity.Name; 
// If needed filter out the domain name here 
int accessLevel = _UserRepository.GetAccessLevel(name) 
// Assuming you use a repository to connect to your database. And also have a method to get the accesslevel for a username 
Session["AccessLevel"] = accessLevel; 
// In case you want to check for accesslevel in the views as well you can put it in a session like so. 

再次,這是一個.NEET 4.5和一個.NET 5應用程序代碼。 C#代碼應該是相同的,但在.NET 5中沒有web.config,因此您必須通過Startup.cs將您的配置置入。

從你在問什麼這似乎是你需要的,如果需要進一步的解釋讓我知道。

+0

這不起作用,因爲只要Allow Anonymous爲真,它就永遠不會傳入Windows網絡ID。因此IsAuthenticated始終爲false。如果我將允許匿名設置爲false,並將Windows身份驗證設置爲True,那麼isAuthenticated始終爲true,並且用戶標識始終存在,但是.Net標識的所有角色管理功能都會被忽略。我將稍微編輯我的帖子。 –

+0

通過使用Windows身份驗證而不是.NET身份驗證,可以獲得您想要的內容。是否有一個特定的原因,你想要.NET認證,而不是Windows?編輯:如果你我可以爲你提供一個工作的例子。 –

+0

我想我想要兩全其美。我不希望通過網絡驗證的用戶第二次輸入其用戶名和密碼(實際上這是要求)。但是現有的數據庫具有所有角色信息以及一些業務邏輯來派生角色。我能夠實現一個自定義的Asp.Net身份提供者,只要我有一個登錄表單,我重新輸入憑據,然後通過LDAP確認身份和密碼是正確的,它就可以很好地工作。 –

0

因此,我仍然希望有人提出更好的答案,因爲我的目標仍然是在使用Windows用戶標識對用戶進行身份驗證後使用和利用.Net身份進行授權。但現在,我要啓用Windows身份驗證和使用該解決方案定製裏克在這個線程提供的授權選項: How do you create a custom AuthorizeAttribute in ASP.NET Core?

所以我會做以下,爲每個角色創建一個類如下:

public class ETimeAdmin : AuthorizationHandler<ETimeAdmin>, IAuthorizationRequirement 
    { 
     protected override void Handle(AuthorizationContext context, ETimeAdmin requirement) 
     { 



     } 
    } 

然後在Startup.cs在配置服務,我會補充:

services.AddAuthorization(options => options.AddPolicy("ETimeAdmin", policy => policy.Requirements.Add(new ETimeAdmin()))); 

最後,我應該能夠使用:

[Authorize(Roles="ETimeAdmin")] 

而不是做上述情況,我想Startup.cs做的就是加入這一行:

 services.AddIdentity<ETimeUser, IdentityRole>(config => 
    { 
    }).AddEntityFrameworkStores<ETimeContext>(); 

然後,我可以只使用什麼是已經提供與.net身份,而無需編寫我的自己的代碼爲每個角色。我不得不使用自己的緩存,因此每次我想檢查用戶是否有權限時都不需要返回數據庫。必須有更好的方法...

相關問題