c# - 应用在添加 Oauth 时重定向到 Account/AccessDenied

标签 c# asp.net-mvc asp.net-core .net-core

我偶然发现了一个问题,即在向当前登录用户添加社交媒体身份验证后,应用程序不一致地将用户重定向到 Account/AccessDenied/。它似乎在用户第一次登录时起作用,然后通过尝试添加另一种身份验证方法,它将用户返回到 Account/AccessDenied?ReturnUrl=%2Fmanage%2Flinklogincallback

我的猜测是 [Authorize] 属性出了问题,但这只是我第二次尝试添加外部身份验证方法。

管理 Controller

[Authorize]
public class ManageController : Controller
{
    //
    // POST: /Manage/LinkLogin
    [HttpPost]
    [ValidateAntiForgeryToken]
    public IActionResult LinkLogin(string provider)
    {
        // Request a redirect to the external login provider to link a login for the current user
        var redirectUrl = Url.Action("LinkLoginCallback", "Manage");
        var properties = _signInManager.ConfigureExternalAuthenticationProperties(provider, redirectUrl, _userManager.GetUserId(User));
        return Challenge(properties, provider);
    }

    //
    // GET: /Manage/LinkLoginCallback
    [HttpGet]
    public async Task<ActionResult> LinkLoginCallback()
    {
        var user = await GetCurrentUserAsync();
        if (user == null)
        {
            return View("Error");
        }
        var info = await _signInManager.GetExternalLoginInfoAsync(await _userManager.GetUserIdAsync(user));
        if (info == null)
        {
            return RedirectToAction(nameof(ManageLogins), new { Message = ManageMessageId.Error });
        }
        var result = await _userManager.AddLoginAsync(user, info);
        var message = result.Succeeded ? ManageMessageId.AddLoginSuccess : ManageMessageId.Error;
        return RedirectToAction(nameof(ManageLogins), new { Message = message });
    }
}

难道是startup.cs的排列顺序?

这是请求/响应

enter image description here

最佳答案

@Rovdjuret 的解决方法帮助了我,直到它被 asp.net 团队解决。这是我的 Controller 登录操作:

public IActionResult Login(string returnUrl = null)
{
    if (_signInManager.IsSignedIn(User))
    {
        // redirect to user profile page
        return RedirectToAction(nameof(HomeFileController.Index), "HomeFile");                
    }
    else
    {
        // clear Identity.External cookie
        if (Request.Cookies["Identity.External"] != null)
        {
            Response.Cookies.Delete("Identity.External");
        }
        return View(new LoginViewModel{ ReturnUrl = returnUrl, RememberMe = true });
    }
}

更新:在最新版本(截至 2017 年 5 月)中,cookie 具有前缀“.AspNetCore.”。所以cookie名称应该是“.AspNetCore.Identity.External

关于c# - 应用在添加 Oauth 时重定向到 Account/AccessDenied,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38751641/

相关文章:

c# - 如何使用 C# 从 sql 中检索二进制数据?

c# - C# 编码结构指针之间有什么区别?

c# - 从 .net 代码和 JavaScript 调用 SignalR hub

c# - 如何在 ASP.NET Core Razor Pages 中为单页应用程序创建包罗万象的路由?

c# - 如何更改 Asp.Net 核心应用程序的端口号?

c# - Json 日期时间问题

c# - 如何从 NopCommerce v3.5 的设置表加载记录

asp.net - 如何控制重复的 Ajax 'post' 提交?

c# - 添加性能计数器类别挂起计算机

visual-studio - Visual Studio (2015) 调试在 DOCKER 容器中运行的集成测试