具有OpenId Connect的WSO2 Identity Server

时间:2016-01-13 17:41:11

标签: asp.net-mvc wso2 wso2is

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

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

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。

    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 Identity Server登录并管理登录,但是当它重定向到Account \ ExternalLoginCallback时,logininfo始终为空。

var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync();

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

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

1 个答案:

答案 0 :(得分:0)

这对我来说效果很好:

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

步骤 2:

   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");
    }