MVC5';链接登录';外部站点丢失当前身份
本文关键字:身份 外部 链接 登录 MVC5 站点 | 更新日期: 2023-09-27 18:21:45
我使用的是MVC系统,在该系统中我使用OWIN身份验证,实现了我自己的IUserStore/等等,所有这些都很好。我没有考虑将我的登录与外部登录链接起来,而且我在使用MVC5附带的代码时遇到了问题。特别是:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult LinkLogin(string provider)
{
// Request a redirect to the external login provider to link a login for the current user
return new ChallengeResult(provider, Url.Action("LinkLoginCallback", "Manage",), User.Identity.GetUserId());
}
和
public class ChallengeResult : HttpUnauthorizedResult
{
// Used for XSRF protection when adding external logins
internal const string XsrfKey = "XsrfId";
public ChallengeResult(string provider, string redirectUri)
: this(provider, redirectUri, null)
{
}
public ChallengeResult(string provider, string redirectUri, string userId)
{
LoginProvider = provider;
RedirectUri = redirectUri;
UserId = userId;
}
public string LoginProvider { get; set; }
public string RedirectUri { get; set; }
public string UserId { get; set; }
public override void ExecuteResult(ControllerContext context)
{
context.RequestContext.HttpContext.Response.SuppressFormsAuthenticationRedirect = true;
var properties = new Microsoft.Owin.Security.AuthenticationProperties() { RedirectUri = RedirectUri };
if (UserId != null)
{
properties.Dictionary[XsrfKey] = UserId;
}
Container.GetInstance<Microsoft.Owin.Security.IAuthenticationManager>().Challenge(properties, LoginProvider);
}
}
我只是更改了质询结果,使其使用我的结构映射DI而不是GetOwinContext作为authenticationmanager。问题是,我的所有控制器都设置了[CustomAuthorize]属性,当我使用LinkLogin方法时,它可以正常工作。context.user.identity变量的AuthenticationType为"ApplicationCookie",这很好,也是我想要的。然而,当它通过"LinkLogin"的challegersult部分时,我再次点击了我的CustomAuthorize代码,现在用户不再是原来的用户了。Context.User.Identity变量现在是AuthenticationType"Negotiate",它的用户名是我的windows登录名
这对我的应用程序根本不起作用,我最终得到了一个403错误,因为它无法将该用户解析为正确的Cookie用户。
是不是我做错了什么?我曾尝试将AllowAnonymous置于LinkLogin之上,但这似乎根本没有帮助。不确定我是否需要以某种方式修改ChallengeResult以更好地满足我的需求。任何帮助都将是伟大的,谢谢!
发现我意外地将一个null值作为"provider"传递。一旦我修复了这个问题,它就正常工作了