c# - OWIN Challenge 方法什么都不做
问题描述
我正在尝试将 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
真正做某事的方法?
我的网络项目中有一个课程OwinStartup
;我将它设置为 OWIN 启动类,如下所示:
[assembly: OwinStartup(typeof(Root.OwinStartup))]
但是由于某种原因,我在这个启动类中的断点从未被击中;OWIN 永远不会被初始化......实际上,等一下,它正在被初始化,但是事件处理程序OnAuthorizationCodeReceivedAsync
永远不会被击中......
如果我单步执行代码,在方法Challenge
中调用之后SignIn
,我会由于某种原因被重定向到 a 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 语句是“hack”,因为在这种情况下您需要两个 return 语句
希望这可以帮助。
推荐阅读
- python - 分级列的熊猫数据框正则表达式过滤
- hybris - 当新的提要/提要更新通过时如何记录 hybris 的最后更改
- amazon-web-services - AWS SNS:编辑短信首选项
- c++ - 如何以编程方式修改视频的 FPS
- javascript - 为什么我的 ReactJS D3 散点图在鼠标输入时中断以及如何修复它?
- swift - Xcode,有没有限制在一个圈子里?
- python - 解析字符串日期格式的可能工具?
- ruby-on-rails - 如何通过 Postman 测试设计 API?
- python - 我将如何从 2D 游戏图像创建布尔矩阵?
- sql - 如何使用 Excel VBA 将变量作为输入参数传递给 SQL 查询?