我在我的ASP.Net MVC 5/WebApi 2項目中使用OWIN的外部身份驗證提供程序,我遇到了一個奇怪的問題。第一次外部登錄嘗試重定向回登錄操作,第二次工作
登錄工作流程與SO完全相同。用戶點擊登錄頁面,挑選供應商,並會記錄我的問題是,在運營商的第一次點擊重定向到同一個登錄頁面:
http://localhost:57291/Account/Login?ReturnUrl=%2fAccount%2fExternalLogin
這將使意義,如果將缺少ExternalLogin行動AllowAnonymous屬性。
當用戶第二次點擊一切正常。
我也嘗試過使用不同的瀏覽器,並且Chrome,IE11和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());
}
}
這真的解決了我的問題!謝謝 –