以编程方式使用IdentityServer3创建OpenID Connect id_token

时间:2017-06-13 15:34:05

标签: identityserver3

我正在将IdentityServer3添加到现有网站上(NopCommerce是特定的)。它拥有自己的注册和身份验证系统,但我们还需要提供OpenID Connect,以便集成后端应用程序。对后端的调用需要为后端验证的当前用户设置id_token以确认身份。

我找到了有关如何使用现有成员资格数据库为IdentityServer3提供用户数据进行检查的信息,但是我对如何为每个用户生成id_token感到困惑。我想明显的答案是用IdentityServer替换网站登录,但是这会为项目的其余部分带来更多问题。理想情况下,我希望用户正常登录,然后调用IdentityServer中的方法生成id_token。

这可能吗?我一直在打猎,但到目前为止找不到任何东西。我找到的最好的是对programmatically sign in to identityserver3的回答。我认为它建议向IdentityServer发布一个HTTP帖子,但感觉有点hacky。

我也找到了Implementing OAuth 2.0 and OpenId Connect provider using IdentityServer3 with existing login server and membership provider,但我不得不承认它已经假设我还没有相当多的知识。

3 个答案:

答案 0 :(得分:0)

当用户登录NopCommerce应用程序时,您可以向身份服务器发送HTTP授权请求。确保在向idsrv发送授权请求时您正在使用prompt = none,这样您将获得id_token或access_token,如果用户已经登录,则不会再次向用户表示同意。

    function getAuthorizeRequest() {
var url = global.appSettings.identityServerURL
                    + "/connect/authorize?client_id=siteB&response_type=id_token token&redirect_uri="
                    + global.appSettings.siteBUrl + "/Main/NopCommerceapp&scope=siteBscope openid email roles&prompt=none&nonce="76767xz676xzc76xz7c67x6c76"                       
return encodeURI(url);}

Checkout idsrv授权端点 https://identityserver.github.io/Documentation/docsv2/endpoints/authorization.html

答案 1 :(得分:0)

我认为您最好的解决方案是实施IdentityServer3并从现有的Nop会员数据库中读取它。然后创建一个自己运行的Web API应用程序,该应用程序利用IdentityServer3设置。在Web API中,您可以实现后端应用程序所需的所有功能,读取和写入Nop数据库。

将Nop前端UI与后端API分开。如果你按照下面的两个链接,你应该可以很快得到一些东西。

Creating the simplest OAuth2 Authorization Server, Client and API
MVC Authentication & Web APIs

答案 2 :(得分:0)

我的解决方案基于John C的回答使用了NopCommece外部认证插件,但我不满意在IdentityServer使用Nop数据库时不得不让Nop进行身份验证和注册。通过外部auth路由似乎是获得OpenID Connect id_token的唯一方法。休息一段时间后重新访问代码,但我找到了以下内容:

https://identityserver.github.io/Documentation/docsv2/configuration/serviceFactory.html https://identityserver.github.io/Documentation/docsv2/configuration/serviceFactory.html

通过实现自定义服务,IdentityServer允许您混淆令牌创建和生成,并且它使用的依赖注入系统使您可以访问默认服务的实例化版本。

之前我曾经按照一个答案向令牌端点发送了用户名和密码。 OpenID规范说这应该只返回access_token,这正是IdenttyService中的DefaultTokenService所做的。但是,通过添加CustomTokenResponseGenerator,我能够重新使用该请求来创建并返回id_token。

CustomTokenResponse类:

internal class CustomTokenResponseGenerator : ICustomTokenResponseGenerator
{

    protected ITokenService _tokenService;

    public CustomTokenResponseGenerator(ITokenService tokenService)
    {
        _tokenService = tokenService;
    }

    public Task<TokenResponse> GenerateAsync(ValidatedTokenRequest request, TokenResponse response)
    {
        var tokenRequest = new TokenCreationRequest
        {
            Subject = request.Subject,
            Client = request.Client,
            Scopes = request.ValidatedScopes.GrantedScopes,
            //Nonce = request.AuthorizationCode.Nonce,

            ValidatedRequest = request
        };
        var idToken = _tokenService.CreateIdentityTokenAsync(tokenRequest);
        idToken.Wait();
        var jwt = _tokenService.CreateSecurityTokenAsync(idToken.Result);
        response.IdentityToken = jwt.Result;
        return Task.FromResult(response);
    }
}

如何在Startup.cs中注入自定义服务:

 factory.TokenService = new Registration<ITokenService, TokenService>();
 factory.CustomTokenResponseGenerator = new Registration<ICustomTokenResponseGenerator, CustomTokenResponseGenerator>();