我正在尝试将Microsoft帐户登录集成到我的 ASP.NET MVC应用程序中,并且我有以下控制器方法:
public void SignIn()
{
// HACK - we will be signed into only one account if we are not signed in to MS
if (Request.GetOwinContext().Authentication.User.Identities.Count() <= 1)
{
// Signal OWIN to send an authorization request to Azure
Request.GetOwinContext().Authentication.Challenge(
new AuthenticationProperties { RedirectUri = "http://localhost:31503/MicrosoftCalendar" },
OpenIdConnectAuthenticationDefaults.AuthenticationType);
}
}
我期望发生的事情是提示我登录我的Microsoft帐户;相反,发生的情况是这种方法一遍又一遍地运行,什么都不做,直到我在浏览器中收到"太多重定向"错误。我怎样才能得到Challenge
方法来实际做某事?
我的 Web 项目中有一个类OwinStartup
;我将其设置为OWIN启动类,如下所示:
[assembly: OwinStartup(typeof(Root.OwinStartup))]
然而,由于某种原因,我在这个启动类中的断点从未被击中;OWIN 从未被初始化...实际上,等一下,它正在初始化,但是OnAuthorizationCodeReceivedAsync
之类的事件处理程序永远不会被击中......
如果我单步执行代码,在SignIn
方法中调用Challenge
后,由于某种原因,我被重定向到UserController
,这反过来又将我重定向回SignIn
方法。我想知道我为什么要在UserController
结束?
编辑:我需要更多的代码?好吧,Global.asax.cs中的这个方法在OWIN调用后立即执行:
protected void MvcApplication_BeginRequest(object sender, EventArgs e)
{
#region Set the context GUID cookie
if (null == Request.Cookies[CookieName.ContextGUID])
{
Response.SetCookie(new System.Web.HttpCookie(CookieName.ContextGUID, Guid.NewGuid().ToString()));
}
#endregion
// check to see whether SSL is required
if (System.Web.Security.FormsAuthentication.RequireSSL)
{
// check where the request is originating from
if (Request.UserHostName != "127.0.0.1" && Request.UserHostName != "localhost")
{
// check if the request is secure
if (!Request.IsSecureConnection)
{
string url = null;
// check for querystring segments
if (!String.IsNullOrEmpty(Request.ServerVariables["QUERY_STRING"]))
{
url = String.Format("https://{0}{1}?{2}",
Request.ServerVariables["SERVER_NAME"],
Request.ServerVariables["SCRIPT_NAME"],
Request.ServerVariables["QUERY_STRING"]);
}
else
{
url = String.Format("https://{0}{1}", Request.ServerVariables["SERVER_NAME"], Request.ServerVariables["SCRIPT_NAME"]);
}
// redirect to the secure url
Response.Redirect(url);
}
}
}
// verify the request
if (null != Request)
{
// NOTE: This is a workaround for the following exception thrown by the ReportViewer control when
// using a non-IE browser:
// Missing URL parameter: IterationId
// See the following reference: https://connect.microsoft.com/VisualStudio/feedback/details/556989/?wa=wsignin1.0
if (Request.Path.EndsWith("Reserved.ReportViewerWebControl.axd") &&
Request.QueryString["ResourceStreamID"] != null &&
Request.QueryString["ResourceStreamID"].ToLower().Contains("blank.gif"))
{
// intercept the request and send to actual valid image path
Response.Redirect(Constant.ImageRoot + "blank.gif");
}
}
}
不确定这是否是导致无限重定向循环的原因,但在这里......
这可能是黑暗中的一枪,但看起来控制器没有返回任何内容,因为它是一个 void 方法,请尝试添加返回类型,我对 OWIN 不太熟悉,所以你必须原谅我,但这是我所说的一个例子:
public ActionResult SignIn()
{
// Signal OWIN to send an authorization request to Azure
return Request.GetOwinContext().Authentication.Challenge(new AuthenticationProperties { RedirectUri = "http://localhost:31503/MicrosoftCalendar" },
OpenIdConnectAuthenticationDefaults.AuthenticationType);
}
方法签名中的两个小更改,返回ActionResult
而不是 void,您可能需要在此处对 OWIN 实际返回的类进行一些研究。 然后添加return
关键字,请注意,这不适用于您所说的"黑客"的 if 语句,因为在这种情况下您需要两个 return 语句
希望这有帮助。