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以更好地满足我的需求。任何帮助都将是伟大的,谢谢!

MVC5';链接登录';外部站点丢失当前身份

发现我意外地将一个null值作为"provider"传递。一旦我修复了这个问题,它就正常工作了