IdentityServer3:将手动凭据登录与社交选项结合在一起

GC。

我正在使用IdentityServer3处理ASP MVC网站中的用户身份验证。

登录屏幕托管在应用程序本身的视图中(不使用Identity Server隐式流程)。我还提供了“使用Google登录”选项,用户可以通过单击登录屏幕上的按钮进行选择。

具有[Authorize](授权)的任何页面都应将未经身份验证的用户重定向到登录屏幕:

    public void Configuration(IAppBuilder app)
    {
        app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationType = "Cookies",
            LoginPath = new PathString("/Account/Login")
        });
    }

帐户控制器的轮廓如下所示。“表单身份验证”方案将起作用(如此处所述)。

通过指定“ acr_values”参数,“使用Google登录”按钮的工作如此处所述(跳过ID服务器登录页面,直接转到Google)。

使用Google登录后,如何处理来自OpenID Connect的回调我尝试添加OpenId Connect中间件,但不能与Cookie身份验证上的“ LoginPath”功能配合使用:未经身份验证的用户现在被重定向到ID Server登录屏幕,而不是我的本地登录屏幕。

我在IdentityServer示例中看不到任何解决此问题的方法。

public class AccountController : Controller
{
    [HttpGet]
    public ActionResult Login()
    {
        ViewBag.GoogleLogin = CreateLoginUrl("Google");

        return View();
    }

    [HttpPost]
    public ActionResult Login(LoginViewModel vm)
    {
        // Call IdentityServer here with credentials
        // Validate token and do the Owin Authentication SignIn
        // Redirect to 'ReturnUrl'

        // If errors:
        return View(vm);
    }

    public ActionResult Callback()
    {
        // What goes here??

        return new RedirectResult("/");
    }

    private string CreateLoginUrl(string provider)
    {
        var state = Guid.NewGuid().ToString("N");
        var nonce = Guid.NewGuid().ToString("N");

        var request = new AuthorizeRequest(new Uri("https://localhost:44312/connect/authorize"));
        var startUrl = request.CreateAuthorizeUrl(
                    clientId: "mvc",
                    responseType: "id_token token",
                    scope: "openid profile roles sampleApi",
                    redirectUri: "https://localhost:44319/Account/Callback",
                    state: state,
                    acrValues: "idp:" + provider,
                    nonce: nonce);

        return startUrl;
    }
}
GC。

我通过使用Map IAppBuilder扩展仅将Open Id Connect中间件应用于单个端点来避免了身份验证提供程序冲突的问题。这样,社交登录流程完全由中间件处理,并且身份验证cookie由两个身份验证提供程序共享。

public void Configuration(IAppBuilder app)
{
    app.UseCookieAuthentication(new CookieAuthenticationOptions
    {
        AuthenticationType = "Cookies",
        LoginPath = new PathString("/Account/Login")
    });
    app.Map(new PathString("/Account/SocialLogin"), ctx =>
    {
        ctx.UseOpenIdConnectAuthentication(Options());
    });
}

和AccountController位:

public class AccountController : Controller
{
    [HttpGet]
    public ActionResult Login(string returnUrl)
    {
        return View(new LoginViewModel { ReturnUrl = returnUrl });
    }

    [HttpPost]
    public async Task<ActionResult> Login(LoginViewModel vm)
    {
        if (!ModelState.IsValid)
        {
            return View(vm);
        }

        // Call IdentityServer here with credentials
        TokenResponse token = await GetToken(vm.UserName, vm.Password);

        // Validate token and do the Owin Authentication SignIn
        // Redirect to 'ReturnUrl'

        await SignInAsync(token);

        return new RedirectResult(vm.ReturnUrl);
    }

    [Authorize]
    public ActionResult SocialLogin(string returnUrl)
    {
        return new RedirectResult(returnUrl);
    }

    // Some helpers omitted
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

手动刹车之前,如何将两部电影混合在一起?

来自分类Dev

将吸气剂结合在一起

来自分类Dev

如何将手势和动画结合在一起

来自分类Dev

将多行ffmpeg命令结合在一起/用管道/链接在一起

来自分类Dev

将CSS过渡和动画结合在一起吗?

来自分类Dev

如何将事件侦听器与事件的“询问”结合在一起?

来自分类Dev

如何使用PHP将XML与不同结构结合在一起?

来自分类Dev

将咖啡和js开发与Gulp结合在一起

来自分类Dev

如何将原位转换和复制转换结合在一起?

来自分类Dev

将JQM,MVC和PhoneGap结合在一起

来自分类Dev

如何将镜头和函子结合在一起?

来自分类Dev

将构建器方法与服务方法结合在一起-不好的做法?

来自分类Dev

将字典与相似键的平均值结合在一起,Python

来自分类Dev

如何将LINQ组和排序与父子表结合在一起?

来自分类Dev

实现`to_xstring()`以将`to_string()`和`to_wstring()`结合在一起

来自分类Dev

将非虚拟接口和多级继承结合在一起

来自分类Dev

将多个标签与Google表格中的常用表格结合在一起

来自分类Dev

将LIMIT SELECT和总数COUNT结合在一起?

来自分类Dev

Java将显式锁与同步方法结合在一起

来自分类Dev

在TypeScript 0.9中将外部模块与内部模块结合在一起

来自分类Dev

将聚合函数与列表项结合在一起时出现SQL错误

来自分类Dev

如何将python asyncio与线程结合在一起?

来自分类Dev

如何使用Lucene.Net将搜索短语与通配符结合在一起?

来自分类Dev

如何将DAO和GUI与MVC结合在一起

来自分类Dev

如何将.toggleClass()与.appendTo()结合在一起?

来自分类Dev

如何将Axios调用循环与等待功能结合在一起?

来自分类Dev

如何将这两个查询结合在一起?(MySQL)

来自分类Dev

是否可以将Arrayformula与Transpose和Sequence结合在一起?

来自分类Dev

将团购与窗口功能结合在一起?

Related 相关文章

  1. 1

    手动刹车之前,如何将两部电影混合在一起?

  2. 2

    将吸气剂结合在一起

  3. 3

    如何将手势和动画结合在一起

  4. 4

    将多行ffmpeg命令结合在一起/用管道/链接在一起

  5. 5

    将CSS过渡和动画结合在一起吗?

  6. 6

    如何将事件侦听器与事件的“询问”结合在一起?

  7. 7

    如何使用PHP将XML与不同结构结合在一起?

  8. 8

    将咖啡和js开发与Gulp结合在一起

  9. 9

    如何将原位转换和复制转换结合在一起?

  10. 10

    将JQM,MVC和PhoneGap结合在一起

  11. 11

    如何将镜头和函子结合在一起?

  12. 12

    将构建器方法与服务方法结合在一起-不好的做法?

  13. 13

    将字典与相似键的平均值结合在一起,Python

  14. 14

    如何将LINQ组和排序与父子表结合在一起?

  15. 15

    实现`to_xstring()`以将`to_string()`和`to_wstring()`结合在一起

  16. 16

    将非虚拟接口和多级继承结合在一起

  17. 17

    将多个标签与Google表格中的常用表格结合在一起

  18. 18

    将LIMIT SELECT和总数COUNT结合在一起?

  19. 19

    Java将显式锁与同步方法结合在一起

  20. 20

    在TypeScript 0.9中将外部模块与内部模块结合在一起

  21. 21

    将聚合函数与列表项结合在一起时出现SQL错误

  22. 22

    如何将python asyncio与线程结合在一起?

  23. 23

    如何使用Lucene.Net将搜索短语与通配符结合在一起?

  24. 24

    如何将DAO和GUI与MVC结合在一起

  25. 25

    如何将.toggleClass()与.appendTo()结合在一起?

  26. 26

    如何将Axios调用循环与等待功能结合在一起?

  27. 27

    如何将这两个查询结合在一起?(MySQL)

  28. 28

    是否可以将Arrayformula与Transpose和Sequence结合在一起?

  29. 29

    将团购与窗口功能结合在一起?

热门标签

归档