如题,,,希望得到关于framwork环境下,OIDC的接入指导,真心求教。
现阶段场景:使用IdentityServer4在CORE服务器下搭建了服务端,现有.net环境下老的站点需要接入授权中心的单点登录【OIDC】,请问客户端没有AddOpenIdConnect方法配置的前提下这边应该怎样接入授权服务中心
Idsv4是不关心客户端是谁的,我有一些想法,不知道是不是你需要的。
首先在Core
的IdentityServer4
上自定义登录地址。
services.AddIdentityServer(options =>
{
// 忽略
options.UserInteraction.LoginUrl = Configuration["ApplicationDTO:LoginUrl"]; // 假设是/users/signIn
options.UserInteraction.LogoutUrl = Configuration["ApplicationDTO:LogoutUrl"]; /
})
新建一个UsersControllers
.添加signIn
的Action
.
[HttpGet]
[Authorize(AuthenticationSchemes = CookieAuthenticationDefaults.AuthenticationScheme)]
public async Task<IActionResult> SignIn(string returnUrl)
{
//通过验证后即清除cookies
await HttpContext.SignOutAsync("Cookies");
#region Issued Cookie
List<Claim> source = new List<Claim>()
{
new Claim("sub",new Guid().ToString()),
new Claim("name",User.Identity.Name),
new Claim("idp", "xxxxx"),
new Claim("role","Custom"),
new Claim("auth_time", DateTimeOffset.Now.ToEpochTime().ToString(),"http://www.w3.org/2001/XMLSchema#integer")
};
source.Add(new Claim("amr", "authorization_code"));
var identity = new ClaimsIdentity(source.Distinct<Claim>((IEqualityComparer<Claim>)new ClaimComparer()), "IdentityServer4", "name", "role");
var claimsPrincipal = new ClaimsPrincipal(identity);
await HttpContext.SignInAsync(IdentityServerConstants.DefaultCookieAuthenticationScheme, claimsPrincipal, new AuthenticationProperties
{
IsPersistent = true,
ExpiresUtc = DateTimeOffset.Now.Add(TimeSpan.FromMinutes(43200))
});
#endregion
return Redirect(returnUrl);
}
Authorize
需要您在startup
自己定义登录地址。
那么流程就是如下这样的
1.在浏览器访问idsv4
服务端https://Coreidsv4/connect/authorize?......
,会跳转到/users/login
通过Authorize
验证用户是否登录,如果未登录就通过Authorization配置的登录地址去登录。登录成功重定向回来。可以在users/login
中填写自己要信息。继续下去,通过url
获取授权码 code
。然后再去拿code
去换取token
.注意参数填写正确。
w哦明白你的意思 大意就是服务端建立一个授权方案 如果发现客户端连进来是401 此时直接302重定向调用此方案进行登录,并且和当前方案进行一个用户票据的绑定 然后重回之前的回调地址。
我现在的主要问题不是在服务端生成,我现在的主要问题是 如果任意一个客户端 比如移动端 或者传统的mvc webform站点这边 官方DMEO中使用的是core模板下的microsoft.aspnetcore.authentication.openidconnect命名空间中的addopenid对每次请求进行一个方案加载,如果没有这个工具 该如何在客户端与服务端建立OIDC连接呢?我期盼的应该是类似于组织一个HTTP请求,然后302登录 在回调方法中对当前已登录和授权状态的请求进行一个本地化的处理。
@小张同学~: 我找了找,暂时没有找到支持.net mvc的方案。Mvc我不知道,但是接入移动端,是点击登录直接访问idsv4
服务端,跳转到登录页面后,输入用户名后密码,登录成功后。根据配置中的回调地址,跳转到回调地址带上授权码。客户端监听浏览器的url
,截取授权码。在post
一个请求到connect/token
获取id_token
和access_token
.
@hellotim: 这两天我尝试了两种方案,因为源代码看的不是很明白,中间遇到了很多奇怪的问题。第一个是使用micorsoft.owin组件建立管道,这个和core有一定的相似之处,但是只能解决mvc站点,让其更新nuger包 可以接入。今天弄了一天,第二套总算是搞通了,在客户端纯依赖过滤器+302重定向+identityModel【重要】,完成了客户端可以获取到code后重定向立马获取到token,最后缓存到session中,完成了全局控制器的一个授权和认证。
@小张同学~: 有demo吗。
@亓亓: 老哥,这都2年了啊。。这东西没啥太多印象了啊,我回头给你找找,我估计可能性不大了。。。
@小张同学~: 有没有联系方式啊,最近我在搞ids4对接framework客户端的问题。
@亓亓: 我找了下 原先的代码找不到了 但是我写了一篇blog 你直接看下就行了https://www.cnblogs.com/parvin-zhang/p/9240663.html
@小张同学~: OK,我去看看,谢谢。
数据库中已包含确定的客户端以及客户端授权码配置 这是前提。且测试使用ids4的时候,授权码模式和简易模式都不能够完成我的需求。
在回调CallBack的时候,默认回传的数据是包含在request.form表单中,获取完毕数据后,自己进行缓存处理。
楼主最后解决这个问题没有啊。我也遇到了这样的问题。