2017-08-04 21 views
4

我用CookieAuthentication在我與owin的應用程序,並設置OnApplyRedirect重定向URL如下面的代碼:Owin:OnApplyRedirect打過幾次電話,並創建不正確RedirectUri

app.UseCookieAuthentication(new CookieAuthenticationOptions 
{ 
    ExpireTimeSpan = TimeSpan.FromDays(30), 
    AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, 
    LoginPath = new PathString("/account/sign-in"), 
    //LogoutPath = new PathString("/account/log-out"), 
    ReturnUrlParameter = "returnTo", 
    CookieName = "BIR", 
    Provider = new CookieAuthenticationProvider() 
    { 
     OnValidateIdentity = SmObjectFactory.Container.GetInstance<IAppUserManager>().OnValidateIdentity(), 
     OnApplyRedirect = c => 
     { 
      if (!c.Request.IsAjaxCall()) 
      { 
       c.Response.Redirect(c.RedirectUri); 
      } 
     } 
    } 
}); 

我的問題是c.RedirectUri值,我設置斷點點和追蹤我的代碼後做到這一點,我明白,OnApplyRedirect稱爲服務時間

在第一次調用RedirectUri是:

http://localhost:7537/account/sign-in?returnTo=%2Fadmin-panel

在第二次調用RedirectUri是:

http://localhost:7537/account/sign-in?returnTo=%2Faccount%2Fsign-in%3FreturnTo%3D%252Fadmin-panel

和更多...

在預先調用舊URL添加新的URL。 我試圖解決這個問題,在另一個和當前的網站搜索和研究,但沒有找到答案,爲什麼OnApplyRedirect多次調用? Configuration方法Startup.cs類只調用一次。 其他細節:

  • Owin版本:3.1.0
  • ASP.NET MVC版本:5.x的
  • 的Visual Studio版本:2017年(15.2)

    Startup class in gist

+2

只是爲了確保'/ account /登錄'不需要驗證。 即它用'[AllowAnonymous]裝飾' – Albert

回答

2

使用提供的身份驗證,我能夠通過註釋[AllowAnonymous]在上重現該問題一個簡單的自動生成的OWIN項目的動作。

因此,您的情況可能是由於登錄操作需要身份驗證而被用於匿名訪問,從而導致無限循環的重定向失敗。

在以下需要授權才能訪問其管理面板的控制器會導致您遇到的問題。

[Authorize] 
[RoutePrefix("account")] 
public class AccountController : Controller { 
    [Route("sign-in")]   
    public ActionResult Signin(string returnTo) {    
     ViewBag.ReturnTo = returnTo; 
     return View(new LoginViewModel { RememberMe = true }); 
    }  

    [Route("admin-panel")] 
    public Action AdminPanel() { 
     return View(); 
    } 
} 

所有登錄,帳戶驗證和密碼恢復行動應與[AllowAnonymous]屬性被標記爲允許匿名訪問,如果他們是[Authorize]控制器

[Authorize] 
[RoutePrefix("account")] 
public class AccountController : Controller { 
    [AllowAnonymous] 
    [Route("sign-in")]   
    public ActionResult Signin(string returnTo) {    
     ViewBag.ReturnTo= returnTo; 
     return View(new LoginViewModel { RememberMe = true }); 
    } 

    [HttpPost] 
    [AllowAnonymous] 
    [ValidateAntiForgeryToken] 
    [Route("sign-in")] 
    public async Task<ActionResult> Signin(LoginViewModel model, string returnTo) { 
     //... 
    } 

    [Route("admin-panel")] 
    public Action AdminPanel() { 
     return View(); 
    } 
} 

或應該被移動到未標記的控制器內與[Authorize]屬性。

[Authorize] 
public class AccountController : Controller { 
    [Route("account/admin-panel")] 
    public Action AdminPanel() { 
     return View(); 
    } 
} 

public class AuthenticationController : Controller { 
    [Route("account/sign-in")]   
    public ActionResult Signin(string returnTo) {    
     ViewBag.ReturnTo= returnTo; 
     return View(new LoginViewModel { RememberMe = true }); 
    } 

    [HttpPost] 
    [ValidateAntiForgeryToken] 
    [Route("account/sign-in")] 
    public async Task<ActionResult> Signin(LoginViewModel model, string returnTo) { 
     //... 
    } 
} 
相關問題