当前位置:  开发笔记 > 编程语言 > 正文

应用程序在添加Oauth时重定向到Account/AccessDenied

如何解决《应用程序在添加Oauth时重定向到Account/AccessDenied》经验,为你挑选了2个好方法。

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

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

ManageController

[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 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如何安排的顺序?

这是请求/响应

在此输入图像描述



1> Ross..:

@rovdjuret的解决方法帮助了我,直到asp.net团队解决了它.这是我的控制器登录操作:

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 "



2> Rama Kathare..:

我也遇到了同样的问题.我从这里使用IdentityServer4 QuickStart示例中的代码

        app.UseGoogleAuthentication(new GoogleOptions
        {
            AuthenticationScheme = "Google",
            DisplayName = "Google",
            SignInScheme = IdentityServerConstants.ExternalCookieAuthenticationScheme,

            ClientId = "xxx.apps.googleusercontent.com",
            ClientSecret = "xxxx-Xxxxxxx"
        });

我不得不将代码更改为以下内容来解决问题.

        var CookieScheme= app.ApplicationServices.GetRequiredService>().Value.Cookies.ExternalCookieAuthenticationScheme;

        app.UseGoogleAuthentication(new GoogleOptions
        {
            AuthenticationScheme = "Google",
            DisplayName = "Google",
            SignInScheme = CookieScheme,

            ClientId = "xxx.apps.googleusercontent.com",
            ClientSecret = "xxxx-Xxxxxxx"
        });

IdentityServerConstants.ExternalAUthenticationScheme我不得不使用常量"外部" 来获取用于从应用程序使用的当前身份系统的cookie选项中识别外部身份验证cookie的方案.这就是为我解决问题的原因.

推荐阅读
135369一生真爱_890
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有