如何使用IdentityServer3从Hybrid流切换到ResourceOwner流

时间:2016-06-14 02:13:49

标签: c# asp.net oauth-2.0 identityserver3

我需要将我的网站升级(或降级)为使用本地登录页面。我使用以下代码

使用混合流程完成了所有工作
app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions(){});

然后当令牌返回时,它将允许我访问以完成asp.net中的身份验证逻辑 - 设置声明身份,委托人等。

  app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions()
            {

                Notifications = new OpenIdConnectAuthenticationNotifications()
                {
                    SecurityTokenValidated = async n =>
                    {
                       // perform transform, etc..

                        n.AuthenticationTicket = new AuthenticationTicket(
                            identity, n.AuthenticationTicket.Properties);

                        await Task.FromResult(0);
                    }
                }
            });

现在,我将从MVC操作方法中收集用户名和密码。我可以通过这种方式从客户端获取访问令牌。

        [HttpPost]
    public ActionResult Login(LoginModel model)
    {
        var client = new TokenClient(
            StsSettings.TokenEndpoint,
            ClientId,
            Secret);

        var x = client.RequestResourceOwnerPasswordAsync(model.UserName, model.Password, "customid openid").Result;

        return View(model);
    }

但我不确定告诉ASP.NET指向我的自定义登录页面而不是身份服务器的最简单方法。我会使用表单身份验证逻辑并创建一些AuthenticationTicket吗?此外,设置ClaimsIdentity的最佳方式是什么(我知道如何获得索赔,只需要一个"钩子")

1 个答案:

答案 0 :(得分:0)

如果您希望资源所有者密码流的结果是登录用户,则需要发出主身份验证cookie以及您对该新身份验证用户的声明。

var claims = new Claim[] { new Claim("name", username), new Claim("sub", "4848784904"), new Claim("email", "BrockAllen@gmail.com"), new Claim("role", "Admin"), new Claim("role", "Dev"), }; // "Cookies" is the name of your cookie middleware, // so change to match what you're actually using in Startup.cs var ci = new ClaimsIdentity(claims, "Cookies", "name", "role"); Request.GetOwinContext().Authentication.SignIn(ci); return Redirect("~/Home/Secure");