我需要使用表单身份验证将Facebook(以及后来的google等)身份验证添加到现有的asp.net webforms应用程序中。
我几乎在那里但是formauthentication和owin身份验证之间似乎存在冲突。我的解决方案基于标准的VS 2015模板。
重定向到外部身份验证提供程序(facebook)的相关代码如下:
string redirectUrl =
ResolveUrl(String.Format(CultureInfo.InvariantCulture,
"~/Account/RegisterExternalLogin?{0}={1}&returnUrl={2}", IdentityHelper.ProviderNameKey,
provider, ReturnUrl));
var properties = new AuthenticationProperties { RedirectUri = redirectUrl };
Context.GetOwinContext().Authentication.Challenge(properties, provider);
Response.StatusCode = 401;
Response.End();
如果我关闭表单身份验证,则此方法有效。如果我有表单身份验证,则会将用户重定向到web.config中定义的表单身份验证URL:
<authentication mode="Forms">
<forms name=".ASPXAUTH_Test" loginUrl="~/start/login.aspx" timeout="60" >
</forms>
</authentication>
根据我的理解,Http状态代码(401)会触发重定向到web.config中的Url。我试图设置其他状态代码,但它们根本不起作用。 当我在web.config中关闭表单身份验证时,实际的登录过程仍然有效(令人惊讶)但是如果我在没有登录到获取丑陋的IIS错误页面的情况下访问受保护的页面,而不是被重定向。
看来,我无法获得工作表单身份验证并拥有外部身份验证以便正常协作:-(
到目前为止,所有替代方案似乎都不适合我: - 切换到身份框架(在我们的特定环境中,绝对不是一个选项。我只是为了完整性而提到它) - 尝试使用web.api或类似的东西(可能有同样的问题) - 放弃owin外部认证并手动实施所有内容
有没有人能够做到这一点?任何帮助表示赞赏。提前致谢。
答案 0 :(得分:1)
Halleluja,我找到了解决方案:
从.Net 4.5可以防止响应中的表单重定向: Response.SuppressFormsAuthenticationRedirect = true;
所以工作代码如下:
var owinContext = Context.GetOwinContext();
owinContext.Authentication.Challenge(properties, provider);
Response.SuppressFormsAuthenticationRedirect = true;
Response.StatusCode = 401;
Response.End();