OWIN Hybrid与IdentityServer 3授权代码错误太长

时间:2017-08-01 17:04:34

标签: azure owin identityserver3 hybrid

请帮助!!!!

我正在尝试遵循here

中的混合实施(Azure AD + Identity Server 3)

我能够访问AAD,我似乎得到了身份验证(获取用户信息等)并收到了context.code:enter image description here


当我将该代码传递给RequestAuthorizationCodeAsync时,我得到一个“ invalid_grant ”,如果我查看客户端,这就是我看到的(授权代码太长):


enter image description here


enter image description here

这是我的代码:

public class Startup
{

    string authority = String.Format(CultureInfo.InvariantCulture, aadInstance, tenant);
    public void Configuration(IAppBuilder app)
    {
        JwtSecurityTokenHandler.InboundClaimTypeMap = new Dictionary<string, string>();

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

        app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
        {
            ClientId = clientId,
            Authority = authority,
            RedirectUri = "https://localhost:44300/",
            PostLogoutRedirectUri = "https://localhost:44300/",
            ResponseType = "code id_token",
            Scope = "openid profile read write offline_access",

            TokenValidationParameters = new TokenValidationParameters
            {
                NameClaimType = "name",
                RoleClaimType = "role"
            },

            SignInAsAuthenticationType = "Cookies",

            Notifications = new OpenIdConnectAuthenticationNotifications
            {
                AuthorizationCodeReceived = async context =>
                    {
                        string userObjectID = context.AuthenticationTicket.Identity.FindFirst("oid").Value;
                        string tenantID = context.AuthenticationTicket.Identity.FindFirst("tid").Value;

                        string appBaseUrl = context.Request.Scheme + "://" + context.Request.Host + context.Request.PathBase;
                        context.ProtocolMessage.RedirectUri = appBaseUrl + "/";
                        context.ProtocolMessage.PostLogoutRedirectUri = appBaseUrl;
                        Uri redirectUri = new Uri(context.Request.Uri.GetLeftPart(UriPartial.Path));
                        string authorizationCode = context.Code;



                        // use the code to get the access and refresh token
                        var tokenClient = new TokenClient(
                            Constants.TokenEndpoint,
                            clientId,
                            "secret", AuthenticationStyle.PostValues);

                        var tokenResponse = await tokenClient.RequestAuthorizationCodeAsync(
                            authorizationCode, context.RedirectUri);

                        if (tokenResponse.IsError)
                        {
                            throw new Exception(tokenResponse.Error);
                        }

                        // use the access token to retrieve claims from userinfo
                        var userInfoClient = new UserInfoClient(
                        new Uri(Constants.UserInfoEndpoint),
                        tokenResponse.AccessToken);

                        var userInfoResponse = await userInfoClient.GetAsync();

                        // create new identity
                        var id = new ClaimsIdentity(context.AuthenticationTicket.Identity.AuthenticationType);
                        id.AddClaims(userInfoResponse.GetClaimsIdentity().Claims);

                        id.AddClaim(new Claim("access_token", tokenResponse.AccessToken));
                        id.AddClaim(new Claim("expires_at", DateTime.Now.AddSeconds(tokenResponse.ExpiresIn).ToLocalTime().ToString()));
                        id.AddClaim(new Claim("refresh_token", tokenResponse.RefreshToken));
                        id.AddClaim(new Claim("id_token", context.ProtocolMessage.IdToken));
                        id.AddClaim(new Claim("sid", context.AuthenticationTicket.Identity.FindFirst("sid").Value));

                        context.AuthenticationTicket = new AuthenticationTicket(
                            new ClaimsIdentity(id.Claims, context.AuthenticationTicket.Identity.AuthenticationType, "name", "role"),
                            context.AuthenticationTicket.Properties);
                    },

                RedirectToIdentityProvider = context =>
                    {
                        // if signing out, add the id_token_hint
                        if (context.ProtocolMessage.RequestType == OpenIdConnectRequestType.LogoutRequest)
                        {
                            var idTokenHint = context.OwinContext.Authentication.User.FindFirst("id_token");

                            if (idTokenHint != null)
                            {
                                context.ProtocolMessage.IdTokenHint = idTokenHint.Value;
                            }

                        }

                        return Task.FromResult(0);
                    }
            }
        });
    }
}

0 个答案:

没有答案