A页面为登录服务器
B页面为客户端服务器
B的首页没有设置Authorize
在B里用<a>标签的方式跳转到A登录,在跳转到B的首页时发现没有授权,必须在控制器加上Authorize,然后通过认证跳转到A验证才能授权,有没有什么方式可以不进行此方式授权
您好,你想实现怎样的授权,是跳到自己的登录站点吗?
是的,用的identityserver4做的单点登录
@TiggerYYYYYYYYY: 单点登录,我没有做过。我做过跳到自己的登录站点实现授权的方案。
@HelloTim: 我做的跟你一样的
@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);
}
@TiggerYYYYYYYYY:
流程就是:
在Startup.cs
中配置idsv4
的options.UserInteraction.LoginUrl
。假设这里设置的值是/Users/signin
。那么你在B页面通过链接过来的时候,回到/Users/SignIn
进行验证。这里的[Authorize(AuthenticationSchemes =‘自己站点的cookie’)]
用户判断自己站点的用户有没有登录,如果登录就继续下去,下面就手动颁发一个cookie就可以了。如果没有登录, 就跳转到自己的站点进行登录然后在跳转,就继续下面的流程。
@HelloTim: 你这也没解决不带Authorize的时候如何验证是否授权
@TiggerYYYYYYYYY:
用户登录的操作的操作总该在自己的登录站点吧!那不是就要跳转到自己的站点上去登录吗?
@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的页面也进行授权