用户服务

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用户服务相关的知识,希望对你有一定的参考价值。

参考技术A

用户服务的例子,请看 这里

IdentityServer3 定义了一个 IUserService 接口来抽象下层的用户身份管理系统,它为本地和第三方账号的用户验证语义,它也提供了IdentityServer生成令牌需要的身份和声明以及用户信息endpoint.用户服务更提供了登陆的工作流(比如接受用户许可协议或者登陆额外需要的2fa)

用户服务的方法分为认证相关方法和令牌声明信息和用户信息相关方法。

IUserService 定义了下面的方法:

所有的认证方法都会收到 SignInMessage 上下文信息:

所有的认证方法都会返回 AuthenticateResult ,它有很多可能的输出结果。它有多个构造函数来初始化不同的输出:

完整登陆必须提供用户的 subject 和 name , subject 是用户服务使用的用户唯一标识, name 用来显示在用户界面上。
声明(Claim) 也可能提供,用户服务的有些方法可能需要这些附加的信息。
如果是通过第三方登陆,那么 identityProvider 参数也需要提供。这个参数可以通过身份令牌里的 idp 声明提供或者用户信息endpoint. 如果通过本地账号登陆,这个参数不应该被使用(会使用默认的 Constants.BuiltInIdentityProvider ).

可选参数 authenticationMethod 生成 amr 声明,用来说明用户该如何验证,如:双因子验证还是客户端证书验证。如果没有传入,那么本地账号期望使用 password ,如果是第三方登陆,那么这个值会是 external 表示是第三方登陆。
所有这些声明( subject , name , idp , amr 和其他 Claim 列表)会用来生成认证cookie。这个认证cookie会由katana cookie认证中间件来管理。认证中间件会使用常量 Constants.PrimaryAuthenticationType 来设定 AuthenticationType 值。

ClaimsPrincipal 由完整登陆创建, IUserService 其它API会通过 Subject 使用。( PostAuthenticateAsync , GetProfileDataAsync , IsActiveAsync , and SignOutAsync ).

除了完整登陆,认证API还可以执行"部分登陆".部分登陆允许用户服务中断用户的正常登陆过程,让用户到一个自定义的页面去完成一些任务后才能继续登陆。(比如完成注册,接受用户许可协议,执行2fa)。、

部分登陆会通过katana认证中间件发送一个"部分登陆的"cookie,认证中间件会使用常量 Constants.PrimaryAuthenticationType 来设定 AuthenticationType 值。
部分登陆可以创建和完整登陆一样的参数( subject , name , claims , amr , and idp )以及 redirectPath . 部分登陆也可以只创建 claims 集合和 redirectPath . 两种方法的最大区别是用户身份已经确认。

托管程序会提供 redirectPath ,用来重定向到自定义的网页上,在这个网页上用户声明可以用来完成自定义的工作流。这个页面可以通过 GetIdentityServerPartialLoginAsync OWIN environment extension method 来获取声明信息.

当用户完成了自定义的任务(接受用户许可协议,注册或者2fa), 用户会被重定向会登陆页面完成完整的登陆过程。重定向用户回来的URL可以通过 GetPartialLoginResumeUrlAsync OWIN environment extension method 方法得到.如果需要用户重新登陆,则调用 GetPartialLoginRestartUrlAsync OWIN environment extension method .

在重定向回登陆页面前,在部分登陆的声明可以通过 UpdatePartialLoginClaimsAsync OWIN environment extension method 改变.如果需要移除或者清除部分登陆则可以使用 RemovePartialLoginCookie OWIN environment extension method .

如果用户从第三方登陆并且没有对应的本地账号。自定义的用户服务也可以重定向会客户端,这需要通过创建一个带有 ExternalIdentity 的 AuthenticateResult ,并传给 AuthenticateExternalAsync API。这会创建一个部分登陆(和上面一样t通过 PartialSignInAuthenticationType ),但是cookie里会用 external_provider_user_id 代替subject声明(或者通过 Constants.ClaimTypes.ExternalProviderUserId ),声明里的Issuer是第三方标识,这个标识可以用来创建本地账号并和第三方账号关联。
一旦用户完成了本地账号注册,他会被重定向会登陆页面来完成完整登陆(和上面机制一样).

最后,认证API可以提供错误信息显示在登陆页面上,这可以通过使用 AuthenticateResult 的接受字符串(错误信息)构造函数来实现。

系统服务和用户服务比较

存储自定义单元文件

系统服务 : /etc/systemd/systemd/system/unit.service

用户服务 : ~/.config/systemd/user/unit.service

重新加载单元文件

系统服务 : # systemctl daemon-reload

用户服务 : $ systemctl --user daemon-reload

启动服务

系统服务 : # systemctl start UNIT

用户服务 : $ systemctl --user start UNIT

停止服务

系统服务 : # systemctl stop UNIT

用户服务 : $ systemctl --user stop UNIT

在计算机启动时启动服务

系统服务 : # systemctl enable UNIT

用户服务 :$ loginctl enable-linger

                   $ systemctl --user enable UNIT

使用systemctl --user命令必须在控制台通过SSH登录,su和sudo不起作用。

systemctl命令与每个用户的systemd --user进程交互,仅当用户首次从控制台或SSH登陆时系统才会启动该进程。

以上是关于用户服务的主要内容,如果未能解决你的问题,请参考以下文章

springboot-服务治理

Linux用户管理-服务服务管理

微服务基础服务的基本组件

服务发现的基本原理

OSGI的系统服务

微服务 六:服务网关