1

我的應用程序(MVC4/C#)使用SimpleMembershipProvider,通常工作正常。但是,我有一個問題,經過數小時的研究和測試後,我無法解決。經過身份驗證的用戶被重定向到登錄

如果我離開我的應用程序一段時間(比如30分鐘),然後選擇一個菜單項,頁面呈現(側欄/頁眉/頁腳),但@RenderBody部分重定向到〜/帳戶/登錄操作。

如果我然後忽略登錄並單擊任何控制器操作鏈接(從菜單),然後按預期加載。看起來,剃刀布局視圖正確認爲我是經過身份驗證的,但控制器認爲我沒有被授權。我有一個基本類,用於我繼承的大部分控制器都具有[Authorize]屬性。

如果我註銷,只有RenderBody部分呈現預期的〜/帳戶/登錄操作。

從web.config中

<system.web> 
    <roleManager enabled="true" /> 
    <authentication mode="Forms"> 
    <forms loginUrl="~/Account/Login" timeout="2880" /> 
    </authentication> 

基地控制器

[Authorize] 
public abstract class AuthorizeBaseController : Controller 
{ 
} 

控制器

public class SiteController : AuthorizeBaseController 
{ 
    private SiteContext db = new SiteContext(); 

    public ActionResult Index() 
    { 
     return View(db.Sites.ToList()); 
    } 

     : 

_Layout.cshtml

: 
<!DOCTYPE html> 
<html lang="en"> 
<head> 
<meta charset="utf-8" /> 
<title>@ViewBag.Title</title> 
<link href="~/favicon.ico" rel="shortcut icon" type="image/x-icon" /> 
<meta name="viewport" content="width=device-width" /> 
@Styles.Render("~/Content/css") 
@Scripts.Render("~/bundles/modernizr") 
@Styles.Render("~/Content/menubar.css") 
</head> 
<body> 
@if (Request.IsAuthenticated) 
{ 
    <div id="header"> 
     : 
    </div> 
    <div id="sidebar"> 
     : 
    </div> <!-- sidebar --> 
} 

<div id="body"> 
    @RenderBody() 
</div> 

@if (Request.IsAuthenticated) 
{ 
    <footer> 
     : 
    </footer> 
} 
@Scripts.Render("~/bundles/jquery") 
@RenderSection("scripts", required: false) 
</body> 
</html> 
+0

看起來是相關[這個問題](http://stackoverflow.com/questions/12257232/role-based-authentication -in-new-mvc-4-internet-template-using-simplemembers) – tr3v

回答

0

該問題是由SimpleMembershipProvider造成的。總之,有時我的Authorize過濾器在InitializeSimpleMembershipAttribute()之前被調用。

我從this post我的解決方案,它指的是一個更詳細的解釋上Scott Allen's blog

0

這是因爲

[Authorize] 

AuthorizeAttribute是MVC內置屬性。使您自己的自定義屬性。你可以期待你的結果。

現在你可以從你的每個控制器和操作中刪除這個授權屬性,然後你的問題就解決了。

+0

請問你能解釋一下嗎?我在以前的項目中使用過這個屬性,但是沒有使用SimpleMembership。我無法刪除它,因爲我定義了角色並且需要[授權(角色=「管理員」)]進行某些操作。 – tr3v

+0

我試着從控制器中刪除[Authorize],正如你所建議的那樣,但是這樣可以有效地移除安全性並讓任何未經驗證的用戶進入。我認爲我的問題與緩存和/或會話管理有關,因爲用戶被識別爲已驗證,但關聯的用戶信息在頁面刷新之前不可用。 – tr3v

+0

對於訪問管理,您可以創建您自己的屬性,如http://stackoverflow.com/a/13284548/2318354中所述,您也可以檢查Session是否存在。所以你會得到完美的結果。 – Dilip0165

相關問題