在 Bluemix 上部署后,将 ASP.NET 代码集成到 Active Directory 或 LDAP



我正在做一个ASP.Net项目,需要在PaaS上完成后部署,这需要是BlueMix(这不是我的选择,这是一个订单)。
此外,我还需要使用:

Active Directory 或 LDAP 到用户身份验证和授权,与 ASP.Net 项目集成。

这里的问题是:
1.我发现仅使用Java或Node.js与Active Directory或SSO服务的集成,但就我而言,我使用的是 ASP.Net
2。我想要一个解决方案,说明如何在活动目录和 ASP.Net 应用程序之间的PaaS之上完成集成。

根据您使用的 ADFS 版本,您应该能够使用 OAuth 或 OIDC 中间件从 ASP.NET Core 应用程序进行连接(假设您使用的是 ASP.NET Core,因为您使用的是 Bluemix)。 如果您至少使用 ADFS 3.0 (Windows Server 2012+),则可以使用 ASP.NET Core 的通用 OAuth 中间件进行连接。

首先,创建一个配置文件来存储 ADFS 服务器设置,或修改现有配置文件(如 appsettings.json)。

示例"adfs-settings.json"文件:

{
"ADFS": {
"ClientId": "Your ClientId as set on ADFS server",
"ResourceUrl": "url of this application (ex: http://mywebapp.mybluemix.net)",
"ServerUrl": "url of ADFS (ex: https://dc.your.domain)"
}
}

如果为 ADFS 配置创建了一个新文件,例如"adfs-settings.json",请将其添加到 Startup.cs 文件的构造函数中的Configuration对象。

public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("adfs-settings.json");
Configuration = builder.Build();
}

在启动的Configure方法中.cs创建一个OAuthOptions对象:

var options = new OAuthOptions();
options.AutomaticChallenge = true;
options.AuthenticationScheme = "ADFS";

指定在 ADFS 服务器上配置此应用程序时创建的ClientId,方法是从Configuration对象读取该应用程序。 通用 OAuth 中间件还要求您在此处提供ClientSecret,即使 ADFS 3.0 实际上并未使用该值。

options.ClientId = Configuration["ADFS:ClientId"];
options.ClientSecret = "ADFS 3.0 does not support confidential client, but OAuth middleware requires it";

设置 ADFS 服务器将在应用程序中重定向到的回调 URL。

options.CallbackPath = new PathString("/signin-adfs");

现在配置OAuthEventsOnRedirectToAuthorizationEndpoint定义在应用程序确定用户需要授权时传递给 ADFS 授权终结点的参数。 这将至少需要一个指向应用程序 url 的resource参数。 当 ADFS 服务器完成对客户端的授权并向应用程序返回包含声明数据的 JWT 令牌时,将触发OnCreatingTicket。 在此方法中,需要处理向HttpContext对象添加角色和声明的过程。

options.Events = new OAuthEvents {
OnRedirectToAuthorizationEndpoint = context =>
{
var parameter = new Dictionary<string, string>
{
["resource"] = Configuration["ADFS:ResourceUrl"]
};
var query = QueryHelpers.AddQueryString(context.RedirectUri, parameter);
context.Response.Redirect(query);
return Task.CompletedTask;
},
OnCreatingTicket = context => {
JwtSecurityTokenHandler tokenHandler = new JwtSecurityTokenHandler();
JwtSecurityToken validatedToken = tokenHandler.ReadJwtToken(context.AccessToken);
IEnumerable<Claim> a = validatedToken.Claims;
foreach (var claim in a)
{
// role claim needs to be mapped to http://schemas.microsoft.com/ws/2008/06/identity/claims/role
// for IsInRole() to work properly
if (claim.Type == "role")
{
context.Identity.AddClaim(new Claim(ClaimTypes.Role, claim.Value));
}
else if (claim.Type == "unique_name")
{
// map name to Identity.Name
context.Identity.AddClaim(new Claim(context.Identity.NameClaimType, claim.Value));
}
else
{
// this is optional, if you want any other specific claims from Active Directory
// this will also include some information about the jwt token such as the issue
// and expire times
context.Identity.AddClaim(new Claim(claim.Type, claim.Value));
}
}
return Task.CompletedTask;
}
};
接下来,将ClaimsIssuer

设置为 ADFS URL,并将SignInScheme设置为CookieAuthenticationDefaults.AuthenticationScheme,并将AuthorizationEndpointTokenEndpoint配置为 ADFS 服务器上的适当终结点。

options.ClaimsIssuer = Configuration["ADFS:ServerUrl"];
options.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.AuthorizationEndpoint = Configuration["ADFS:ServerUrl"] + "/adfs/oauth2/authorize/";
options.TokenEndpoint = Configuration["ADFS:ServerUrl"] + "/adfs/oauth2/token/";

最后,使用刚刚创建的选项添加 OAuth 中间件:

app.UseCookieAuthentication(new CookieAuthenticationOptions());
app.UseOAuthAuthentication(options);

现在,您应该能够将[Authorize]属性应用于任何需要 ADFS 授权的控制器或操作。 有关完整的示例应用程序,请参阅此 GitHub 存储库。

最新更新