我正在将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,但我不得不承认它已经假设我还没有相当多的知识。
答案 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>();