简体   繁体   English

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

[英]Integrating ASP.NET code to Active Directory or LDAP after deploying on Bluemix

I'm working on an ASP.Net project, which needs to be deployed after completion on PaaS, which needs to be BlueMix (It wasn't my choice, It was an order). 我正在开发一个ASP.Net项目,需要在PaaS完成后部署,需要BlueMix (这不是我的选择,这是一个订单)。
In addition I need to use an: 另外我需要使用:

Active Directory or LDAP to the User Authentication and Authorization, integrated with the ASP.Net Project. Active Directory或LDAP到用户身份验证和授权,与ASP.Net项目集成。

The Issues Here Are : 这里的问题是:
1. I have found an integration to the Active Directory or SSO Services using only Java or Node.js, but in my case I am using ASP.Net 1.我发现只使用Java或Node.js集成到Active Directory或SSO服务,但在我的情况下,我使用的是ASP.Net
2. I want a solution for how the integration can be done on top of the PaaS between the Active Directory and ASP.Net application. 2.我想要一个解决方案,了解如何在Active Directory和ASP.Net应用程序之间的PaaS之上完成集成。

Depending on which version of ADFS you're using, you should be able to use either OAuth or OIDC middleware to connect from an ASP.NET Core application (assuming you're using ASP.NET Core because you're using Bluemix). 根据您使用的ADFS版本,您应该能够使用OAuth或OIDC中间件从ASP.NET Core应用程序进行连接(假设您使用的是ASP.NET Core,因为您使用的是Bluemix)。 If you're using at least ADFS 3.0 (Windows Server 2012+), you can use ASP.NET Core's generic OAuth middleware to connect. 如果您至少使用ADFS 3.0(Windows Server 2012+),则可以使用ASP.NET Core的通用OAuth中间件进行连接。

First, create a configuration file to store your ADFS server settings, or modify an existing configuration file (such as appsettings.json). 首先,创建配置文件以存储ADFS服务器设置,或修改现有配置文件(例如appsettings.json)。

Sample "adfs-settings.json" file: 示例“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)"
  }
}

If you created a new file, such as "adfs-settings.json", for your ADFS configuration, add it to your Configuration object in the constructor of your Startup.cs file. 如果为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();
}

In your Configure method of Startup.cs create an OAuthOptions object: 在Startup.cs的Configure方法中,创建一个OAuthOptions对象:

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

Specify the ClientId that you created when configuring this application on your ADFS server by reading it from your Configuration object. 通过从Configuration对象中读取此应用程序,指定在ADFS服务器上配置此应用程序时创建的ClientId The generic OAuth middleware also requires that you provide a ClientSecret here even though that value is not actually used by ADFS 3.0. 通用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";

Set the callback url which the ADFS server will redirect to in your application. 设置ADFS服务器将在您的应用程序中重定向到的回调URL。

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

Now configure the OAuthEvents . 现在配置OAuthEvents OnRedirectToAuthorizationEndpoint defines parameters which are passed to the ADFS authorization endpoint when the application determines that a user needs to be authorized. OnRedirectToAuthorizationEndpoint定义当应用程序确定需要授权用户时传递给ADFS授权终结点的参数。 This will require at least a resource parameter which points to the url of your application. 这将至少需要一个指向应用程序URL的resource参数。 OnCreatingTicket is triggered when the ADFS server has finished authorizing a client and returns a JWT token containing claims data to your application. 当ADFS服务器完成对客户端的授权并将包含声明数据的JWT令牌返回给您的应用程序时,将触发OnCreatingTicket In this method you'll need to process adding roles and claims to the HttpContext object. 在此方法中,您需要处理向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;
        }
    };

Next, set the ClaimsIssuer to the ADFS url and set the SignInScheme to CookieAuthenticationDefaults.AuthenticationScheme and configure the AuthorizationEndpoint and TokenEndpoint to the proper endpoints on your ADFS server. 接下来,将ClaimsIssuer设置为ADFS URL并将SignInScheme设置为SignInSchemeCookieAuthenticationDefaults.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/";

Finally, add the OAuth middleware using the options you've just created: 最后,使用您刚刚创建的选项添加OAuth中间件:

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

Now you should be able to apply the [Authorize] attribute to any controller or action which requires authorization with ADFS. 现在,您应该能够将[Authorize]属性应用于需要使用ADFS进行授权的任何控制器或操作。 For a complete sample application see this GitHub repo . 有关完整的示例应用程序,请参阅此GitHub存储库

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM