2014-04-29 23 views
8

Tôi đang sử dụng các nhà cung cấp xác thực bên ngoài của OWIN trong dự án ASP.Net MVC 5/WebApi 2 của tôi và tôi đã gặp phải sự cố lạ.Lần đăng nhập bên ngoài đầu tiên chuyển hướng trở lại hành động đăng nhập, lần thứ hai hoạt động

Quy trình đăng nhập giống hệt như ở đây trên SO. Người sử dụng truy cập các trang đăng nhập, chọn một nhà cung cấp và sẽ được ghi lại trong vấn đề của tôi là nhấp chuột đầu tiên vào một nhà cung cấp chuyển hướng trở lại với cùng trang đăng nhập:.

http://localhost:57291/Account/Login?ReturnUrl=%2fAccount%2fExternalLogin 

này sẽ có ý nghĩa nếu hành động ExternalLogin sẽ thiếu thuộc tính AllowAnonymous.

Khi người dùng nhấp vào lần thứ hai mọi thứ hoạt động.

Tôi cũng đã thử rằng với các trình duyệt khác nhau và sự cố nhất quán trên Chrome, IE11 và Firefox.

Login.cshtml:

@using (Html.BeginForm("ExternalLogin", "Account", new { ReturnUrl = ViewBag.ReturnUrl })) 
{ 
    <fieldset> 
     <legend>@Strings.ExternalAuthenticationProvidersDescription</legend> 
     <p> 
      @foreach (var p in Model.ExternalAuthenticationProviders) 
      { 
       <button type="submit" name="provider" value="@p.AuthenticationType" title="Log in using your @p.Caption account">@p.Caption</button> 
      } 
     </p> 
    </fieldset> 
} 

AccountController.cs

public class AccountController : Controller 
{ 
    ... 

    [AllowAnonymous] 
    [HttpPost] 
    public ActionResult ExternalLogin(string provider, string returnUrl) 
    { 
     return new ChallengeResult(provider, Url.Action("ExternalLoginCallback", "Account", new 
     { 
      loginProvider = provider, 
      ReturnUrl = returnUrl 
     })); 
    } 
    ... 
} 

ChallengeResult.cs:

public class ChallengeResult : HttpUnauthorizedResult 
{ 
    public ChallengeResult(string provider, string redirectUrl) 
    { 
     LoginProvider = provider; 
     RedirectUrl = redirectUrl; 
    } 

    public string LoginProvider { get; set; } 
    public string RedirectUrl { get; set; } 

    public override void ExecuteResult(ControllerContext context) 
    { 
     context.HttpContext.GetOwinContext().Authentication.Challenge(new AuthenticationProperties 
     { 
      RedirectUri = RedirectUrl 
     }, LoginProvider); 
    } 
} 

FilterConfig.cs

public class FilterConfig 
{ 
    public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     filters.Add(new HandleErrorAttribute()); 

     // make all api controllers secure by default 
     filters.Add(new AuthorizeAttribute()); 
    } 
} 

Trả lời

8

Hóa ra vấn đề này là dự án của tôi ban đầu bắt đầu ra như là một ứng dụng MVC 4 trong đó có này trong web.config gây ra vấn đề:

<authentication mode="Forms"> 
    <forms loginUrl="~/Account/Login" timeout="2880" /> 
</authentication> 

Tôi nghĩ rằng cả hai OWIN và Xác thực mẫu đã hoạt động cùng một lúc.

+0

điều này thực sự cố định nó cho tôi! cảm ơn –

0

Tôi gặp vấn đề tương tự xảy ra khi tôi cập nhật ASPNet.Web.Pages.Web.Data 3.1.1 nuget thành bất kỳ phiên bản nào sau này. Với 3.1.1 nó hoạt động! Tôi tìm thấy giải pháp here.

0

Khi Xác thực mẫu đã được thêm, tôi đã được chuyển hướng đến Trang đăng nhập. Vì vậy, loại bỏ mã này giúp

<authentication mode="Forms"> 
    <forms loginUrl="~/Account/Login" timeout="2880" /> 
</authentication> 

nhưng tôi đã phải thêm dòng này cũng

<system.webServer> 
    <validation validateIntegratedModeConfiguration="false" /> 
    <modules> 
     <remove name="FormsAuthentication" /> <-- added this line to remove it completely --> 
    </modules> 
</system.webServer> 

hy vọng điều này giúp một ai đó.

Các vấn đề liên quan