我正在上使用Windows身份驗證模式,在該Web.config
文件中的以下<system.web>
部分內網運行的C#ASP.NET MVC應用程序:保持ASP.NET MVC應用程序從引用舊的HttpContextBase的WindowsIdentity
<system.web>
<compilation debug="true" targetFramework="4.5.2" />
<httpRuntime targetFramework="4.5.2" />
<authentication mode="Windows" />
<authorization>
<deny users="?" />
</authorization>
<identity impersonate="true" />
</system.web>
我已經創建了自己的類,它擴展了AuthorizeAttribute
以基於連接的Windows帳戶進行一些處理。在重寫的AuthorizeCore
函數中,我從HttpContextBase.User.Identity
中獲取WindowsIdentity
對象,並使用它來獲取名稱,域等數據。然後,我繼續使用這些數據來查詢數據庫中的某些記錄,並確定此函數是否返回對或錯。返回false後,瀏覽器會彈出一個簡單的用戶名和密碼框,允許用戶提供一個不同的Windows帳戶/密碼來使用,而不是當前用戶使用的帳戶/密碼。
的AuthorizeCore
功能看起來如何在我的項目的樣本如下:
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
using (DbEntities dbContext = new DbEntities())
{
bool authorize = allowedGroups.Length == 0;
string domainAndUserName = httpContext.User.Identity.Name;
int userNameIndex = domainAndUserName.IndexOf(@"\", StringComparison.OrdinalIgnoreCase) + 1;
string userName = domainAndUserName.Substring(userNameIndex);
try
{
// Process account and query database...
// set authorize to true if criteria met, otherwise false...
}
catch (EntityException ex)
{
authorize = false;
}
catch (SqlException ex)
{
authorize = false;
}
return authorize;
}
}
假設與Windows帳戶USER_1用戶連接時,AuthrorizeCore
功能然後設置domainAndUserName
變量DOMAIN\USER_1
(如圖上面)查詢數據庫,並最終確定它沒有被授權。出現用戶名/密碼框,用戶現在輸入授權的USER_2的適當憑證。用戶現在可以訪問請求的資源。現在,如果用戶關閉瀏覽器,重新打開它,並請求資源(或另一個)從HttpContextBase
對象拉出的WindowsIdentity
似乎引用舊的USER_2帳戶而不是當前的USER_1帳戶(domainAndUserName
變量結束值爲DOMAIN\USER_2
而不是DOMAIN\USER_1
)。
看來,如果我稍等一下,它會使用USER_1 WindowsIdentity
,所以它看起來像是一些緩存功能,但我無法驗證或查明。我已經做了一些在線搜索,並試圖完全禁用IIS服務器緩存以及清除瀏覽器緩存,但我仍然遇到這種情況。任何幫助或指導如何總是AuthorizeCore
函數的HttpContextBase.User.Identity
始終引用當前的Windows帳戶將不勝感激。
?它可以與會話相關嗎?您是否嘗試禁用會話? –
據我所知,我沒有做任何特定的邏輯來設置任何類型的會話。 – Fizz
我無法幫助您解決具體的問題,但是我建議您針對您的方法改變一些內容。首先,你不應該在屬性中進行數據庫查詢。該屬性應該僅具有基於在頁面初始化期間執行的先前查詢來確定授權的邏輯。其次,您不應該同時使用基於屬性和基於web.config的身份驗證。事實上,基於web.config的授權在MVC應用程序中被認爲是不可以的,您應該只依賴基於屬性的方法。 –