gpt4 book ai didi

c# - 如何将 IdentityServer4 身份映射到任何 WebApp(.Net MVC 样板、.Net Core 样板)

转载 作者:太空狗 更新时间:2023-10-29 17:54:29 28 4
gpt4 key购买 nike

我正在创建一个 SSO 服务器,以将所有用户集中在 ActiveDirectory(AD) 中并在那里管理他们,而不是每个特定应用程序的数据库。

为了制作这个服务器,我使用了 IdentityServer4(Idsr4) 和 Ldap/AD Extension

我已经将 Idsr4 设置为使用基于 AD 的身份(这是“集中式身份”),用户现在可以使用自己的 AD 登录名/密码登录 Idsr4

现在的问题是如何将集中身份映射到应用程序。我想在多个应用程序中使用相同的身份用户。

我通读了 IdentityServer4 的文档,但找不到与建议的结构相关的任何内容。

有没有人有一个清晰的结构设置可以用来理解整个设置? (分离如 Asp.Net MVC Boilerplate、IdentityServer4、Protected Api。)

IdentityServer4 配置:

 public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();

// configure identity server with in-memory stores, keys, clients and scopes
services.AddIdentityServer()
.AddDeveloperSigningCredential()
////.AddSigningCredential(...) // Strongly recommended, if you want something more secure than developer signing (Read The Manual since it's highly recommended)
.AddInMemoryIdentityResources(InMemoryInitConfig.GetIdentityResources())
.AddInMemoryApiResources(InMemoryInitConfig.GetApiResources())
.AddInMemoryClients(InMemoryInitConfig.GetClients())
.AddLdapUsers<OpenLdapAppUser>(Configuration.GetSection("IdentityServerLdap"), UserStore.InMemory);
}

IdentityServer4 InMemoryInitConfig:

namespace QuickstartIdentityServer{
public class InMemoryInitConfig
{
// scopes define the resources in your system
public static IEnumerable<IdentityResource> GetIdentityResources()
{
return new List<IdentityResource>
{
new IdentityResources.OpenId(),
new IdentityResources.Profile(),
};
}

public static IEnumerable<ApiResource> GetApiResources()
{
return new List<ApiResource>
{
new ApiResource("api1", "My API")
};
}

// clients want to access resources (aka scopes)
public static IEnumerable<Client> GetClients()
{
// client credentials client
return new List<Client>
{

//DEMO HTTP CLIENT
new Client
{
ClientId = "demo",
ClientSecrets = new List<Secret> {new Secret("password".Sha256()) } ,
ClientName = "demo",
AllowedGrantTypes = {
GrantType.ClientCredentials, // Server to server
GrantType.ResourceOwnerPassword, // User to server
GrantType.Implicit
},

//GrantTypes.HybridAndClientCredentials,
AllowAccessTokensViaBrowser = true,

AllowOfflineAccess = true,
AccessTokenLifetime = 90, // 1.5 minutes
AbsoluteRefreshTokenLifetime = 0,
RefreshTokenUsage = TokenUsage.OneTimeOnly,
RefreshTokenExpiration = TokenExpiration.Sliding,
UpdateAccessTokenClaimsOnRefresh = true,
RequireConsent = false,

RedirectUris = {
"http://localhost:6234/"
},

PostLogoutRedirectUris = { "http://localhost:6234" },
AllowedCorsOrigins ={ "http://localhost:6234/" },

AllowedScopes =
{
IdentityServerConstants.StandardScopes.OpenId,
IdentityServerConstants.StandardScopes.Profile,
"api1"
},

},



};
}
}

我的客户端配置:

public void Configuration(IAppBuilder app)

{

app.UseAbp();

app.UseOAuthBearerAuthentication(AccountController.OAuthBearerOptions);

// ABP
//app.UseCookieAuthentication(new CookieAuthenticationOptions
//{
// AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
// LoginPath = new PathString("/Account/Login"),
// // evaluate for Persistent cookies (IsPermanent == true). Defaults to 14 days when not set.
// //ExpireTimeSpan = new TimeSpan(int.Parse(ConfigurationManager.AppSettings["AuthSession.ExpireTimeInDays.WhenPersistent"] ?? "14"), 0, 0, 0),
// //SlidingExpiration = bool.Parse(ConfigurationManager.AppSettings["AuthSession.SlidingExpirationEnabled"] ?? bool.FalseString)
// ExpireTimeSpan = TimeSpan.FromHours(12),
// SlidingExpiration = true
//});
// END ABP

/// IDENTITYSERVER
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = "Cookies"
});

app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
{
Authority = "http://localhost:5443", //ID Server
ClientId = "demo",
ClientSecret = "password",
ResponseType = "id_token token",
SignInAsAuthenticationType = "Cookies",
RedirectUri = "http://localhost:6234/", //URL of website when cancel login on idsvr4
PostLogoutRedirectUri = "http://localhost:6234", //URL Logout ??? << when this occor
Scope = "openid",
RequireHttpsMetadata = false,

//AuthenticationMode = Microsoft.Owin.Security.AuthenticationMode.Active,

});
/// END IDENTITYSERVER

app.UseExternalSignInCookie("Cookies");

app.MapSignalR();
}

更新

我正在阅读有关 OpenID Connect 的文档,发现可以为 httpContext 创建通知以获取用户在 Idsrv4 用户信息端点中的声明,如下所示:

public void Configuration(IAppBuilder app)

{

app.UseAbp();

// ABP
//app.UseOAuthBearerAuthentication(AccountController.OAuthBearerOptions);

//app.UseCookieAuthentication(new CookieAuthenticationOptions
//{
// AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
// LoginPath = new PathString("/Account/Login"),
// // evaluate for Persistent cookies (IsPermanent == true). Defaults to 14 days when not set.
// //ExpireTimeSpan = new TimeSpan(int.Parse(ConfigurationManager.AppSettings["AuthSession.ExpireTimeInDays.WhenPersistent"] ?? "14"), 0, 0, 0),
// //SlidingExpiration = bool.Parse(ConfigurationManager.AppSettings["AuthSession.SlidingExpirationEnabled"] ?? bool.FalseString)
// ExpireTimeSpan = TimeSpan.FromHours(12),
// SlidingExpiration = true
//});
// END ABP

/// IDENTITYSERVER
AntiForgeryConfig.UniqueClaimTypeIdentifier = Thinktecture.IdentityModel.Client.JwtClaimTypes.Subject;
JwtSecurityTokenHandler.DefaultInboundClaimFilter.Clear();

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = "Cookies"
});

// CONFIG OPENID
var openIdConfig = new OpenIdConnectAuthenticationOptions
{
Authority = "http://localhost:5443", //ID Server
ClientId = "demo",
ClientSecret = "password",
ResponseType = "id_token token",
SignInAsAuthenticationType = "Cookies",
RedirectUri = "http://localhost:6234/", //URL of website when cancel login on idsvr4
PostLogoutRedirectUri = "http://localhost:6234", //URL Logout ??? << when this occor
Scope = "openid profile api1",
RequireHttpsMetadata = false,

// get userinfo
Notifications = new OpenIdConnectAuthenticationNotifications {
SecurityTokenValidated = async n => {
var userInfoClient = new UserInfoClient(
new Uri(n.Options.Authority + "/connect/userinfo"),
n.ProtocolMessage.AccessToken);

var userInfo = await userInfoClient.GetAsync();

// create new identity and set name and role claim type
var nid = new ClaimsIdentity(
n.AuthenticationTicket.Identity.AuthenticationType,
ClaimTypes.GivenName,
ClaimTypes.Role);

foreach (var x in userInfo.Claims) {
nid.AddClaim(new Claim(x.Item1, x.Item2));
}

// keep the id_token for logout
nid.AddClaim(new Claim("id_token", n.ProtocolMessage.IdToken));

// add access token for sample API
nid.AddClaim(new Claim("access_token", n.ProtocolMessage.AccessToken));

// keep track of access token expiration
nid.AddClaim(new Claim("expires_at", DateTimeOffset.Now.AddSeconds(int.Parse(n.ProtocolMessage.ExpiresIn)).ToString()));

// add some other app specific claim
//nid.AddClaim(new Claim("app_specific", "some data"));

n.AuthenticationTicket = new AuthenticationTicket(
nid,
n.AuthenticationTicket.Properties);

n.Request.Headers.SetValues("Authorization ", new string[] { "Bearer ", n.ProtocolMessage.AccessToken });

}
}

};
// END CONFIG OPENID

app.UseOpenIdConnectAuthentication(openIdConfig);

/// END IDENTITYSERVER

app.UseExternalSignInCookie("Cookies");

app.MapSignalR();
}

更新 2

谢谢@Khanh TO,

我完全按照你的建议做了,我保留了每个应用程序的数据库

但是为了不再通过应用程序数据库管理用户,我硬编码了一个从 idsr4 用户信息端点获取的方法

在 abpUsers 表中创建或更新用户所需的信息,然后应用程序解释数据并执行必要的操作

更具体地说:在我发送到客户端的 AccountControllerredirect_uri 中,我有一个 ActionResult 完成所有这些工作,调用必要的方法来创建/在客户端用户表上更新用户

最佳答案

我认为 GrantType.ResourceOwnerPassword 流程不支持 AD 登录并且 UseOpenIdConnectAuthentication 也不支持 ,您可以使用 ImplicitHybrid 流。
一旦您对您的客户端 mvc 应用程序进行身份验证,您就可以在 HttpContext.User 中查看任何声明并找到正确的声明值作为用户身份(它们只是声明,无需创建本地帐户)

关于c# - 如何将 IdentityServer4 身份映射到任何 WebApp(.Net MVC 样板、.Net Core 样板),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55761896/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com