带有 OpenId 连接的 WSO2 身份服务器 [英] WSO2 Identity Server with OpenId Connect

查看:18
本文介绍了带有 OpenId 连接的 WSO2 身份服务器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试将 WSO2 Identity Server (5.1.0) 与 Asp.Net MVC 一起使用,作为概念证明,我在 Visual Studio 2015 中创建了一个示例 asp.net MVC 项目.

I am trying to use WSO2 Identity Server (5.1.0) with Asp.Net MVC, as a proof of concept i created a sample asp.net MVC project in visual studio 2015.

按照 WSO2 指南,我已根据需要配置了身份服务器.

Following the WSO2 Guide, i have configured the identity server as required.

https://docs.wso2.com/display/IS510/OpenID+Connect+with+the+WSO2+Identity+Server+and+WSO2+OAuth2+Playground

在示例应用程序中,我添加了对 Microsoft.Owin.Security.OpenIdConnect 的引用,并将代码添加到 Startup.Auth.cs 文件中的 ConfigureAuth.

On the sample application, i have added reference to Microsoft.Owin.Security.OpenIdConnect and added code to ConfigureAuth in Startup.Auth.cs file.

    public void ConfigureAuth(IAppBuilder app)
    {
        // Configure the db context, user manager and signin manager to use a single instance per request
        app.CreatePerOwinContext(ApplicationDbContext.Create);
        app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
        app.CreatePerOwinContext<ApplicationSignInManager>(ApplicationSignInManager.Create);

        // Enable the application to use a cookie to store information for the signed in user
        // and to use a cookie to temporarily store information about a user logging in with a third party login provider
        // Configure the sign in cookie
        app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
            LoginPath = new PathString("/Account/Login"),
            Provider = new CookieAuthenticationProvider
            {
                // Enables the application to validate the security stamp when the user logs in.
                // This is a security feature which is used when you change a password or add an external login to your account.  
                OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
                    validateInterval: TimeSpan.FromMinutes(30),
                    regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
            }
        });            
        app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);

        // Enables the application to temporarily store user information when they are verifying the second factor in the two-factor authentication process.
        app.UseTwoFactorSignInCookie(DefaultAuthenticationTypes.TwoFactorCookie, TimeSpan.FromMinutes(5));

        // Enables the application to remember the second login verification factor such as phone or email.
        // Once you check this option, your second step of verification during the login process will be remembered on the device where you logged in from.
        // This is similar to the RememberMe option when you log in.
        app.UseTwoFactorRememberBrowserCookie(DefaultAuthenticationTypes.TwoFactorRememberBrowserCookie);

        // Uncomment the following lines to enable logging in with third party login providers
        //app.UseMicrosoftAccountAuthentication(
        //    clientId: "",
        //    clientSecret: "");

        //app.UseTwitterAuthentication(
        //   consumerKey: "",
        //   consumerSecret: "");

        //app.UseFacebookAuthentication(
        //   appId: "",
        //   appSecret: "");

        //app.UseGoogleAuthentication(new GoogleOAuth2AuthenticationOptions()
        //{
        //    ClientId = "",
        //    ClientSecret = ""
        //});

        app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
        {
            ClientId = "SENmQQ9fOWcrqXjK1u3lXINhXtEa",
            ClientSecret = "bFBJQqj4GT2Wfv8735fTTuHh3Isa",
            Authority = "https://localhost:9443",
            RedirectUri = "https://wso2openid.local.co.uk/Account/ExternalLoginCallback",
            SignInAsAuthenticationType = "ClientCredCookie",
            ResponseType = "id_token token",
            Scope = "openid",

            Configuration = new OpenIdConnectConfiguration
            {
                AuthorizationEndpoint = "https://localhost:9443/oauth2/authorize",
                TokenEndpoint = "https://localhost:9443/oauth2/token"
            },

            Notifications = new OpenIdConnectAuthenticationNotifications()
            {
                RedirectToIdentityProvider = n =>
                {
                    return Task.FromResult(0);
                },

                SecurityTokenReceived = n =>
                {
                    return Task.FromResult(0);
                },

                AuthorizationCodeReceived = n =>
                {
                    return Task.FromResult(0);
                },

                SecurityTokenValidated = n =>
                {
                    var token = n.ProtocolMessage.AccessToken;

                    // persist access token in cookie
                    if (!string.IsNullOrEmpty(token))
                    {
                        n.AuthenticationTicket.Identity.AddClaim(
                            new Claim("access_token", token));
                    }

                    return Task.FromResult(0);
                },

                AuthenticationFailed = notification =>
                {
                    if (string.Equals(notification.ProtocolMessage.Error, "access_denied", StringComparison.Ordinal))
                    {
                        notification.HandleResponse();

                        notification.Response.Redirect("/");
                    }

                    return Task.FromResult<object>(null);
                }
            }
        });
    }

当我运行应用程序时,登录时它会重定向到 WSO2 身份服务器登录并设法登录,但是当它重定向到 AccountExternalLoginCallback 时,登录信息始终为空.

When i run the application, on login it redirects to WSO2 Identity Server login and manage to login but when it redirect to AccountExternalLoginCallback, the logininfo is always null.

var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync();

任何关于为什么这不起作用的建议将不胜感激.?

Any advise as to why this is not working will be appreciated.?

注意:我试图在 SecurityTokenValidated 上设置一个断点,但它没有达到那个断点.我遇到的唯一断点是 RedirectToIdentityProvider.

NB: I tried to put a break point on SecurityTokenValidated but it did not hit that break point. The only breakpoint which i got hit was RedirectToIdentityProvider.

推荐答案

这对我来说很好用:

第 1 步:使用以下命令配置 WSO2:https://docs.wso2.com/display/IS570/Logging+in+to+a+.NET+application+using+the+Identity+Server

Step1 : Config WSO2 with this: https://docs.wso2.com/display/IS570/Logging+in+to+a+.NET+application+using+the+Identity+Server

第二步:

   public async Task<RedirectResult> LoginOAuth()
    {
        var url = "https://localhost:9443/oauth2/authorize?response_type=code&client_id=5a8urZQAc0r4R7iUS9ar1wOoq9Ma&scope=openid&redirect_uri=http://localhost:49545/Home/GetCode";

        var client = new HttpClient();
        var response = await client.GetAsync(url);
        
        string urlDistance = response.RequestMessage.RequestUri.ToString();
        client.Dispose();

        return Redirect(urlDistance);
    }


    public async Task<RedirectToRouteResult> GetCode()
    {
        //باشد GetCode همشون حتما باید
        var client = new HttpClient();
        string code = Request.QueryString["code"];
        string sessionState = Request.QueryString["session_state"];
        string client_id = Request.QueryString["client_id"];
        client.Dispose();
        //از طریق ارسال کد میخواد توکن رو بگیره
        //****************
        var values = new Dictionary<string, string>
        {
            { "code", code },
            { "sessionState", sessionState },
            { "client_id", "5a8urZQAc0r4R7iUS9ar1wOoq9Ma" },
            { "client_secret", "b0yefcCc4ftVYJm7ffQi2IZZ0eMa" },
            { "grant_type", "authorization_code" },
            { "redirect_uri", "http://localhost:49545/Home/GetCode" }//??????????????
        };
        var content = new FormUrlEncodedContent(values);
        client = new HttpClient();
        var response2 = await client.PostAsync("https://localhost:9443/oauth2/token", content);
        string responseString = await response2.Content.ReadAsStringAsync();
        JObject jsonResult = JObject.Parse(responseString);

        string access_token = jsonResult["access_token"].ToString();
        string refresh_token = jsonResult["refresh_token"].ToString();
        string scope = jsonResult["scope"].ToString();
        string id_token = jsonResult["id_token"].ToString();
        string token_type = jsonResult["token_type"].ToString();
        string expires_in = jsonResult["expires_in"].ToString();
        
        //**************

        var httpClient = new HttpClient();
        httpClient.BaseAddress = new Uri("https://localhost:9443/oauth2/userinfo?schema=openid");
        httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", access_token);
        string result = await httpClient.GetStringAsync("/oauth2/userinfo?schema=openid");


        return RedirectToAction("Contact");
    }

这篇关于带有 OpenId 连接的 WSO2 身份服务器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆