首页 新闻 赞助 找找看

关于identityserver4认证问题

0
悬赏园豆:20 [待解决问题]

A页面为登录服务器

B页面为客户端服务器

B的首页没有设置Authorize

在B里用<a>标签的方式跳转到A登录,在跳转到B的首页时发现没有授权,必须在控制器加上Authorize,然后通过认证跳转到A验证才能授权,有没有什么方式可以不进行此方式授权

TiggerYYYYYYYYY的主页 TiggerYYYYYYYYY | 初学一级 | 园豆:95
提问于:2017-11-28 09:58
< >
分享
所有回答(1)
0

您好,你想实现怎样的授权,是跳到自己的登录站点吗?

ohyex | 园豆:1496 (小虾三级) | 2017-11-28 10:08

是的,用的identityserver4做的单点登录

支持(0) 反对(0) TiggerYYYYYYYYY | 园豆:95 (初学一级) | 2017-11-28 10:10

@TiggerYYYYYYYYY: 单点登录,我没有做过。我做过跳到自己的登录站点实现授权的方案。

支持(0) 反对(0) ohyex | 园豆:1496 (小虾三级) | 2017-11-28 10:19

@HelloTim: 我做的跟你一样的

支持(0) 反对(0) TiggerYYYYYYYYY | 园豆:95 (初学一级) | 2017-11-28 10:19

@TiggerYYYYYYYYY:
Startup.cs

ConfigureServices配置idsv4:

//idsv4默认的cookies和自己站点的cookie有冲突 需要自己手动设置一下默认
services.AddAuthentication(options =>
            {
                options.DefaultAuthenticateScheme = "idsrv";
                options.DefaultChallengeScheme = "idsrv";
            });

services.AddIdentityServer(options =>
            {
                options.IssuerUri = Configuration["ApplicationDTO:IssuerUri"];
                options.UserInteraction.LoginUrl = Configuration["ApplicationDTO:LoginUrl"]; //配置你登录控制器的路由 如:`/users/signin`
                options.UserInteraction.LogoutUrl = Configuration["ApplicationDTO:LogoutUrl"];
            })
            .AddSigningCredential(
                    new SigningCredentials(new X509SecurityKey(certkey), SecurityAlgorithms.RsaSha256))
                 .AddConfigurationStore(options =>
                 {
                     options.ConfigureDbContext = builder =>
                         builder.UseSqlServer(connectionString,
                             sql =>
                             {
                                 sql.MigrationsAssembly(migrationsAssembly);
                                 sql.UseRowNumberForPaging();
                             });
                 })
                 .AddOperationalStore(options =>
                 {
                     options.ConfigureDbContext = builder =>
                            builder.UseSqlServer(connectionString,sql => sql.MigrationsAssembly(migrationsAssembly));
                     options.EnableTokenCleanup = true;
                     options.TokenCleanupInterval = 30;
                 });

在登录控制器中添加 这里默认是 /users/signin 作为授权

[HttpGet]
        [Authorize(AuthenticationSchemes = CookieAuthenticationDefaults.AuthenticationScheme)] //AuthenticationScheme设置验证的是自己登录站点颁发cookie
        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","cnblogs"),
                new Claim("idp", "cnblogs"),
                new Claim("role","cnblogs"),
                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);

        }
支持(0) 反对(0) ohyex | 园豆:1496 (小虾三级) | 2017-11-28 10:33

@TiggerYYYYYYYYY:
流程就是:
Startup.cs中配置idsv4options.UserInteraction.LoginUrl。假设这里设置的值是/Users/signin。那么你在B页面通过链接过来的时候,回到/Users/SignIn进行验证。这里的[Authorize(AuthenticationSchemes =‘自己站点的cookie’)]用户判断自己站点的用户有没有登录,如果登录就继续下去,下面就手动颁发一个cookie就可以了。如果没有登录, 就跳转到自己的站点进行登录然后在跳转,就继续下面的流程。

支持(0) 反对(0) ohyex | 园豆:1496 (小虾三级) | 2017-11-28 10:41

@HelloTim: 你这也没解决不带Authorize的时候如何验证是否授权

支持(0) 反对(0) TiggerYYYYYYYYY | 园豆:95 (初学一级) | 2017-11-28 11:02

@TiggerYYYYYYYYY:
用户登录的操作的操作总该在自己的登录站点吧!那不是就要跳转到自己的站点上去登录吗?

支持(0) 反对(0) ohyex | 园豆:1496 (小虾三级) | 2017-11-28 11:10

@HelloTim: 我再解释一遍吧,

A为你的站点登录服务器,

B为你的客户端服务器,

在B用a标签写一个这样的跳转页面<a href="http://a/account/login?retuernUrl=http://b">

B的index控制器是没有添加Authorize

在A登陆后返回到B的index,

问题出现,

B的Index没有通过授权,但是B里的控制有带Authorize的就会跳转到A授权通过

我现在的需求是在没有带Authorize的页面也进行授权

支持(0) 反对(0) TiggerYYYYYYYYY | 园豆:95 (初学一级) | 2017-11-28 11:16
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册