diff --git a/samples/IdentitySample.Mvc/IdentitySample.Mvc.xproj b/samples/IdentitySample.Mvc/IdentitySample.Mvc.xproj index 13b00b9794..659b35e899 100644 --- a/samples/IdentitySample.Mvc/IdentitySample.Mvc.xproj +++ b/samples/IdentitySample.Mvc/IdentitySample.Mvc.xproj @@ -12,7 +12,7 @@ 2.0 - 5131 + 41532 \ No newline at end of file diff --git a/src/Microsoft.AspNet.Identity/SecurityStampValidator.cs b/src/Microsoft.AspNet.Identity/SecurityStampValidator.cs index 7b9ae17c39..ba9b6d7ca7 100644 --- a/src/Microsoft.AspNet.Identity/SecurityStampValidator.cs +++ b/src/Microsoft.AspNet.Identity/SecurityStampValidator.cs @@ -30,7 +30,9 @@ namespace Microsoft.AspNet.Identity var user = await manager.ValidateSecurityStampAsync(context.Principal, userId); if (user != null) { - await manager.SignInAsync(user, context.Properties, authenticationMethod: null); + // REVIEW: note we lost login authenticaiton method + context.ReplacePrincipal(await manager.CreateUserPrincipalAsync(user)); + context.ShouldRenew = true; } else { diff --git a/test/Microsoft.AspNet.Identity.InMemory.Test/FunctionalTest.cs b/test/Microsoft.AspNet.Identity.InMemory.Test/FunctionalTest.cs index 74c56ce9c0..fd53910d12 100644 --- a/test/Microsoft.AspNet.Identity.InMemory.Test/FunctionalTest.cs +++ b/test/Microsoft.AspNet.Identity.InMemory.Test/FunctionalTest.cs @@ -1,332 +1,330 @@ -//// Copyright (c) .NET Foundation. All rights reserved. -//// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -//using System; -//using System.IO; -//using System.Linq; -//using System.Net; -//using System.Net.Http; -//using System.Security.Claims; -//using System.Text; -//using System.Threading.Tasks; -//using System.Xml; -//using System.Xml.Linq; -//using Microsoft.AspNet.Builder; -//using Microsoft.AspNet.Http; -//using Microsoft.AspNet.Http.Authentication; -//using Microsoft.AspNet.Http.Features.Authentication; -//using Microsoft.AspNet.TestHost; -//using Microsoft.Framework.DependencyInjection; -//using Shouldly; -//using Xunit; -//using Microsoft.AspNet.Identity.Test; -//using System.Diagnostics; +using System; +using System.IO; +using System.Linq; +using System.Net; +using System.Net.Http; +using System.Security.Claims; +using System.Text; +using System.Threading.Tasks; +using System.Xml; +using System.Xml.Linq; +using Microsoft.AspNet.Builder; +using Microsoft.AspNet.Http; +using Microsoft.AspNet.Http.Authentication; +using Microsoft.AspNet.Http.Features.Authentication; +using Microsoft.AspNet.TestHost; +using Microsoft.Framework.DependencyInjection; +using Shouldly; +using Xunit; +using Microsoft.AspNet.Identity.Test; -//namespace Microsoft.AspNet.Identity.InMemory -//{ -// public class FunctionalTest -// { -// const string TestPassword = "1qaz!QAZ"; +namespace Microsoft.AspNet.Identity.InMemory +{ + public class FunctionalTest + { + const string TestPassword = "1qaz!QAZ"; -// [Fact] -// public async Task CanChangePasswordOptions() -// { -// var clock = new TestClock(); -// var server = CreateServer(services => services.ConfigureIdentity(options => -// { -// options.Password.RequireUppercase = false; -// options.Password.RequireNonLetterOrDigit = false; -// options.Password.RequireDigit = false; -// })); + [Fact] + public async Task CanChangePasswordOptions() + { + var clock = new TestClock(); + var server = CreateServer(services => services.ConfigureIdentity(options => + { + options.Password.RequireUppercase = false; + options.Password.RequireNonLetterOrDigit = false; + options.Password.RequireDigit = false; + })); -// var transaction1 = await SendAsync(server, "http://example.com/createSimple"); -// transaction1.Response.StatusCode.ShouldBe(HttpStatusCode.OK); -// Assert.Null(transaction1.SetCookie); -// } + var transaction1 = await SendAsync(server, "http://example.com/createSimple"); + transaction1.Response.StatusCode.ShouldBe(HttpStatusCode.OK); + Assert.Null(transaction1.SetCookie); + } -// [Fact] -// public async Task CanCreateMeLoginAndCookieStopsWorkingAfterExpiration() -// { -// var clock = new TestClock(); -// var server = CreateServer(services => services.ConfigureIdentityApplicationCookie(appCookieOptions => -// { -// appCookieOptions.SystemClock = clock; -// appCookieOptions.ExpireTimeSpan = TimeSpan.FromMinutes(10); -// appCookieOptions.SlidingExpiration = false; -// })); + [Fact] + public async Task CanCreateMeLoginAndCookieStopsWorkingAfterExpiration() + { + var clock = new TestClock(); + var server = CreateServer(services => services.ConfigureIdentityApplicationCookie(appCookieOptions => + { + appCookieOptions.SystemClock = clock; + appCookieOptions.ExpireTimeSpan = TimeSpan.FromMinutes(10); + appCookieOptions.SlidingExpiration = false; + })); -// var transaction1 = await SendAsync(server, "http://example.com/createMe"); -// transaction1.Response.StatusCode.ShouldBe(HttpStatusCode.OK); -// Assert.Null(transaction1.SetCookie); + var transaction1 = await SendAsync(server, "http://example.com/createMe"); + transaction1.Response.StatusCode.ShouldBe(HttpStatusCode.OK); + Assert.Null(transaction1.SetCookie); -// var transaction2 = await SendAsync(server, "http://example.com/pwdLogin/false"); -// transaction2.Response.StatusCode.ShouldBe(HttpStatusCode.OK); -// Assert.NotNull(transaction2.SetCookie); -// transaction2.SetCookie.ShouldNotContain("; expires="); + var transaction2 = await SendAsync(server, "http://example.com/pwdLogin/false"); + transaction2.Response.StatusCode.ShouldBe(HttpStatusCode.OK); + Assert.NotNull(transaction2.SetCookie); + transaction2.SetCookie.ShouldNotContain("; expires="); -// var transaction3 = await SendAsync(server, "http://example.com/me", transaction2.CookieNameValue); -// FindClaimValue(transaction3, ClaimTypes.Name).ShouldBe("hao"); -// Assert.Null(transaction3.SetCookie); + var transaction3 = await SendAsync(server, "http://example.com/me", transaction2.CookieNameValue); + FindClaimValue(transaction3, ClaimTypes.Name).ShouldBe("hao"); + Assert.Null(transaction3.SetCookie); -// clock.Add(TimeSpan.FromMinutes(7)); + clock.Add(TimeSpan.FromMinutes(7)); -// var transaction4 = await SendAsync(server, "http://example.com/me", transaction2.CookieNameValue); -// FindClaimValue(transaction4, ClaimTypes.Name).ShouldBe("hao"); -// Assert.Null(transaction4.SetCookie); + var transaction4 = await SendAsync(server, "http://example.com/me", transaction2.CookieNameValue); + FindClaimValue(transaction4, ClaimTypes.Name).ShouldBe("hao"); + Assert.Null(transaction4.SetCookie); -// clock.Add(TimeSpan.FromMinutes(7)); + clock.Add(TimeSpan.FromMinutes(7)); -// var transaction5 = await SendAsync(server, "http://example.com/me", transaction2.CookieNameValue); -// FindClaimValue(transaction5, ClaimTypes.Name).ShouldBe(null); -// Assert.Null(transaction5.SetCookie); -// } + var transaction5 = await SendAsync(server, "http://example.com/me", transaction2.CookieNameValue); + FindClaimValue(transaction5, ClaimTypes.Name).ShouldBe(null); + Assert.Null(transaction5.SetCookie); + } -// [Theory] -// [InlineData(true)] -// [InlineData(false)] -// public async Task CanCreateMeLoginAndSecurityStampExtendsExpiration(bool rememberMe) -// { -// var clock = new TestClock(); -// var server = CreateServer(services => services.ConfigureIdentityApplicationCookie(appCookieOptions => -// { -// appCookieOptions.SystemClock = clock; -// })); + [Theory] + [InlineData(true)] + [InlineData(false)] + public async Task CanCreateMeLoginAndSecurityStampExtendsExpiration(bool rememberMe) + { + var clock = new TestClock(); + var server = CreateServer(services => services.ConfigureIdentityApplicationCookie(appCookieOptions => + { + appCookieOptions.SystemClock = clock; + })); -// var transaction1 = await SendAsync(server, "http://example.com/createMe"); -// transaction1.Response.StatusCode.ShouldBe(HttpStatusCode.OK); -// Assert.Null(transaction1.SetCookie); + var transaction1 = await SendAsync(server, "http://example.com/createMe"); + transaction1.Response.StatusCode.ShouldBe(HttpStatusCode.OK); + Assert.Null(transaction1.SetCookie); -// var transaction2 = await SendAsync(server, "http://example.com/pwdLogin/" + rememberMe); -// transaction2.Response.StatusCode.ShouldBe(HttpStatusCode.OK); -// Assert.NotNull(transaction2.SetCookie); -// if (rememberMe) -// { -// transaction2.SetCookie.ShouldContain("; expires="); -// } -// else -// { -// transaction2.SetCookie.ShouldNotContain("; expires="); -// } + var transaction2 = await SendAsync(server, "http://example.com/pwdLogin/" + rememberMe); + transaction2.Response.StatusCode.ShouldBe(HttpStatusCode.OK); + Assert.NotNull(transaction2.SetCookie); + if (rememberMe) + { + transaction2.SetCookie.ShouldContain("; expires="); + } + else + { + transaction2.SetCookie.ShouldNotContain("; expires="); + } -// var transaction3 = await SendAsync(server, "http://example.com/me", transaction2.CookieNameValue); -// FindClaimValue(transaction3, ClaimTypes.Name).ShouldBe("hao"); -// Assert.Null(transaction3.SetCookie); + var transaction3 = await SendAsync(server, "http://example.com/me", transaction2.CookieNameValue); + FindClaimValue(transaction3, ClaimTypes.Name).ShouldBe("hao"); + Assert.Null(transaction3.SetCookie); -// // Make sure we don't get a new cookie yet -// clock.Add(TimeSpan.FromMinutes(10)); -// var transaction4 = await SendAsync(server, "http://example.com/me", transaction2.CookieNameValue); -// FindClaimValue(transaction4, ClaimTypes.Name).ShouldBe("hao"); -// Assert.Null(transaction4.SetCookie); + // Make sure we don't get a new cookie yet + clock.Add(TimeSpan.FromMinutes(10)); + var transaction4 = await SendAsync(server, "http://example.com/me", transaction2.CookieNameValue); + FindClaimValue(transaction4, ClaimTypes.Name).ShouldBe("hao"); + Assert.Null(transaction4.SetCookie); -// // Go past SecurityStampValidation interval and ensure we get a new cookie -// clock.Add(TimeSpan.FromMinutes(21)); + // Go past SecurityStampValidation interval and ensure we get a new cookie + clock.Add(TimeSpan.FromMinutes(21)); -// var transaction5 = await SendAsync(server, "http://example.com/me", transaction2.CookieNameValue); -// Assert.NotNull(transaction5.SetCookie); -// FindClaimValue(transaction5, ClaimTypes.Name).ShouldBe("hao"); + var transaction5 = await SendAsync(server, "http://example.com/me", transaction2.CookieNameValue); + Assert.NotNull(transaction5.SetCookie); + FindClaimValue(transaction5, ClaimTypes.Name).ShouldBe("hao"); -// // Make sure new cookie is valid -// var transaction6 = await SendAsync(server, "http://example.com/me", transaction5.CookieNameValue); -// FindClaimValue(transaction6, ClaimTypes.Name).ShouldBe("hao"); -// } + // Make sure new cookie is valid + var transaction6 = await SendAsync(server, "http://example.com/me", transaction5.CookieNameValue); + FindClaimValue(transaction6, ClaimTypes.Name).ShouldBe("hao"); + } -// [Fact] -// public async Task TwoFactorRememberCookieVerification() -// { -// var server = CreateServer(); + [Fact] + public async Task TwoFactorRememberCookieVerification() + { + var server = CreateServer(); -// var transaction1 = await SendAsync(server, "http://example.com/createMe"); -// transaction1.Response.StatusCode.ShouldBe(HttpStatusCode.OK); -// Assert.Null(transaction1.SetCookie); + var transaction1 = await SendAsync(server, "http://example.com/createMe"); + transaction1.Response.StatusCode.ShouldBe(HttpStatusCode.OK); + Assert.Null(transaction1.SetCookie); -// var transaction2 = await SendAsync(server, "http://example.com/twofactorRememeber"); -// transaction2.Response.StatusCode.ShouldBe(HttpStatusCode.OK); + var transaction2 = await SendAsync(server, "http://example.com/twofactorRememeber"); + transaction2.Response.StatusCode.ShouldBe(HttpStatusCode.OK); -// string setCookie = transaction2.SetCookie; -// setCookie.ShouldContain(IdentityOptions.TwoFactorRememberMeCookieAuthenticationScheme + "="); -// setCookie.ShouldContain("; expires="); + string setCookie = transaction2.SetCookie; + setCookie.ShouldContain(IdentityOptions.TwoFactorRememberMeCookieAuthenticationScheme + "="); + setCookie.ShouldContain("; expires="); -// var transaction3 = await SendAsync(server, "http://example.com/isTwoFactorRememebered", transaction2.CookieNameValue); -// transaction3.Response.StatusCode.ShouldBe(HttpStatusCode.OK); -// } + var transaction3 = await SendAsync(server, "http://example.com/isTwoFactorRememebered", transaction2.CookieNameValue); + transaction3.Response.StatusCode.ShouldBe(HttpStatusCode.OK); + } -// private static string FindClaimValue(Transaction transaction, string claimType) -// { -// var claim = transaction.ResponseElement.Elements("claim").SingleOrDefault(elt => elt.Attribute("type").Value == claimType); -// if (claim == null) -// { -// return null; -// } -// return claim.Attribute("value").Value; -// } + private static string FindClaimValue(Transaction transaction, string claimType) + { + var claim = transaction.ResponseElement.Elements("claim").SingleOrDefault(elt => elt.Attribute("type").Value == claimType); + if (claim == null) + { + return null; + } + return claim.Attribute("value").Value; + } -// private static async Task GetAuthData(TestServer server, string url, string cookie) -// { -// var request = new HttpRequestMessage(HttpMethod.Get, url); -// request.Headers.Add("Cookie", cookie); + private static async Task GetAuthData(TestServer server, string url, string cookie) + { + var request = new HttpRequestMessage(HttpMethod.Get, url); + request.Headers.Add("Cookie", cookie); -// HttpResponseMessage response2 = await server.CreateClient().SendAsync(request); -// string text = await response2.Content.ReadAsStringAsync(); -// XElement me = XElement.Parse(text); -// return me; -// } + HttpResponseMessage response2 = await server.CreateClient().SendAsync(request); + string text = await response2.Content.ReadAsStringAsync(); + XElement me = XElement.Parse(text); + return me; + } -// private static TestServer CreateServer(Action configureServices = null, Func testpath = null, Uri baseAddress = null) -// { -// var server = TestServer.Create(app => -// { -// app.UseIdentity(); -// app.Use(async (context, next) => -// { -// var req = context.Request; -// var res = context.Response; -// var userManager = context.RequestServices.GetRequiredService>(); -// var signInManager = context.RequestServices.GetRequiredService>(); -// PathString remainder; -// if (req.Path == new PathString("/normal")) -// { -// res.StatusCode = 200; -// } -// else if (req.Path == new PathString("/createMe")) -// { -// var result = await userManager.CreateAsync(new TestUser("hao"), TestPassword); -// res.StatusCode = result.Succeeded ? 200 : 500; -// } -// else if (req.Path == new PathString("/createSimple")) -// { -// var result = await userManager.CreateAsync(new TestUser("simple"), "aaaaaa"); -// res.StatusCode = result.Succeeded ? 200 : 500; -// } -// else if (req.Path == new PathString("/protected")) -// { -// res.StatusCode = 401; -// } -// else if (req.Path.StartsWithSegments(new PathString("/pwdLogin"), out remainder)) -// { -// var isPersistent = bool.Parse(remainder.Value.Substring(1)); -// var result = await signInManager.PasswordSignInAsync("hao", TestPassword, isPersistent, false); -// res.StatusCode = result.Succeeded ? 200 : 500; -// } -// else if (req.Path == new PathString("/twofactorRememeber")) -// { -// var user = await userManager.FindByNameAsync("hao"); -// await signInManager.RememberTwoFactorClientAsync(user); -// res.StatusCode = 200; -// } -// else if (req.Path == new PathString("/isTwoFactorRememebered")) -// { -// var user = await userManager.FindByNameAsync("hao"); -// var result = await signInManager.IsTwoFactorClientRememberedAsync(user); -// res.StatusCode = result ? 200 : 500; -// } -// else if (req.Path == new PathString("/twofactorSignIn")) -// { -// } -// else if (req.Path == new PathString("/me")) -// { -// var auth = new AuthenticateContext("Application"); -// Debugger.Launch(); -// auth.Authenticated(context.User, new AuthenticationProperties().Items, new AuthenticationDescription().Items); -// Describe(res, auth); -// } -// else if (req.Path.StartsWithSegments(new PathString("/me"), out remainder)) -// { -// var auth = new AuthenticateContext(remainder.Value.Substring(1)); -// await context.Authentication.AuthenticateAsync(auth); -// Describe(res, auth); -// } -// else if (req.Path == new PathString("/testpath") && testpath != null) -// { -// await testpath(context); -// } -// else -// { -// await next(); -// } -// }); -// }, -// services => -// { -// services.AddIdentity(); -// services.AddSingleton, InMemoryUserStore>(); -// services.AddSingleton, InMemoryRoleStore>(); -// if (configureServices != null) -// { -// configureServices(services); -// } -// }); -// server.BaseAddress = baseAddress; -// return server; -// } + private static TestServer CreateServer(Action configureServices = null, Func testpath = null, Uri baseAddress = null) + { + var server = TestServer.Create(app => + { + app.UseIdentity(); + app.Use(async (context, next) => + { + var req = context.Request; + var res = context.Response; + var userManager = context.RequestServices.GetRequiredService>(); + var signInManager = context.RequestServices.GetRequiredService>(); + PathString remainder; + if (req.Path == new PathString("/normal")) + { + res.StatusCode = 200; + } + else if (req.Path == new PathString("/createMe")) + { + var result = await userManager.CreateAsync(new TestUser("hao"), TestPassword); + res.StatusCode = result.Succeeded ? 200 : 500; + } + else if (req.Path == new PathString("/createSimple")) + { + var result = await userManager.CreateAsync(new TestUser("simple"), "aaaaaa"); + res.StatusCode = result.Succeeded ? 200 : 500; + } + else if (req.Path == new PathString("/protected")) + { + res.StatusCode = 401; + } + else if (req.Path.StartsWithSegments(new PathString("/pwdLogin"), out remainder)) + { + var isPersistent = bool.Parse(remainder.Value.Substring(1)); + var result = await signInManager.PasswordSignInAsync("hao", TestPassword, isPersistent, false); + res.StatusCode = result.Succeeded ? 200 : 500; + } + else if (req.Path == new PathString("/twofactorRememeber")) + { + var user = await userManager.FindByNameAsync("hao"); + await signInManager.RememberTwoFactorClientAsync(user); + res.StatusCode = 200; + } + else if (req.Path == new PathString("/isTwoFactorRememebered")) + { + var user = await userManager.FindByNameAsync("hao"); + var result = await signInManager.IsTwoFactorClientRememberedAsync(user); + res.StatusCode = result ? 200 : 500; + } + else if (req.Path == new PathString("/twofactorSignIn")) + { + } + else if (req.Path == new PathString("/me")) + { + var auth = new AuthenticateContext("Application"); + auth.Authenticated(context.User, new AuthenticationProperties().Items, new AuthenticationDescription().Items); + Describe(res, auth); + } + else if (req.Path.StartsWithSegments(new PathString("/me"), out remainder)) + { + var auth = new AuthenticateContext(remainder.Value.Substring(1)); + await context.Authentication.AuthenticateAsync(auth); + Describe(res, auth); + } + else if (req.Path == new PathString("/testpath") && testpath != null) + { + await testpath(context); + } + else + { + await next(); + } + }); + }, + services => + { + services.AddIdentity(); + services.AddSingleton, InMemoryUserStore>(); + services.AddSingleton, InMemoryRoleStore>(); + if (configureServices != null) + { + configureServices(services); + } + }); + server.BaseAddress = baseAddress; + return server; + } -// private static void Describe(HttpResponse res, AuthenticateContext result) -// { -// res.StatusCode = 200; -// res.ContentType = "text/xml"; -// var xml = new XElement("xml"); -// if (result != null && result.Principal != null) -// { -// xml.Add(result.Principal.Claims.Select(claim => new XElement("claim", new XAttribute("type", claim.Type), new XAttribute("value", claim.Value)))); -// } -// if (result != null && result.Properties != null) -// { -// xml.Add(result.Properties.Select(extra => new XElement("extra", new XAttribute("type", extra.Key), new XAttribute("value", extra.Value)))); -// } -// using (var memory = new MemoryStream()) -// { -// using (var writer = new XmlTextWriter(memory, Encoding.UTF8)) -// { -// xml.WriteTo(writer); -// } -// res.Body.Write(memory.ToArray(), 0, memory.ToArray().Length); -// } -// } + private static void Describe(HttpResponse res, AuthenticateContext result) + { + res.StatusCode = 200; + res.ContentType = "text/xml"; + var xml = new XElement("xml"); + if (result != null && result.Principal != null) + { + xml.Add(result.Principal.Claims.Select(claim => new XElement("claim", new XAttribute("type", claim.Type), new XAttribute("value", claim.Value)))); + } + if (result != null && result.Properties != null) + { + xml.Add(result.Properties.Select(extra => new XElement("extra", new XAttribute("type", extra.Key), new XAttribute("value", extra.Value)))); + } + using (var memory = new MemoryStream()) + { + using (var writer = new XmlTextWriter(memory, Encoding.UTF8)) + { + xml.WriteTo(writer); + } + res.Body.Write(memory.ToArray(), 0, memory.ToArray().Length); + } + } -// private static async Task SendAsync(TestServer server, string uri, string cookieHeader = null, bool ajaxRequest = false) -// { -// var request = new HttpRequestMessage(HttpMethod.Get, uri); -// if (!string.IsNullOrEmpty(cookieHeader)) -// { -// request.Headers.Add("Cookie", cookieHeader); -// } -// if (ajaxRequest) -// { -// request.Headers.Add("X-Requested-With", "XMLHttpRequest"); -// } -// var transaction = new Transaction -// { -// Request = request, -// Response = await server.CreateClient().SendAsync(request), -// }; -// if (transaction.Response.Headers.Contains("Set-Cookie")) -// { -// transaction.SetCookie = transaction.Response.Headers.GetValues("Set-Cookie").SingleOrDefault(); -// } -// if (!string.IsNullOrEmpty(transaction.SetCookie)) -// { -// transaction.CookieNameValue = transaction.SetCookie.Split(new[] { ';' }, 2).First(); -// } -// transaction.ResponseText = await transaction.Response.Content.ReadAsStringAsync(); + private static async Task SendAsync(TestServer server, string uri, string cookieHeader = null, bool ajaxRequest = false) + { + var request = new HttpRequestMessage(HttpMethod.Get, uri); + if (!string.IsNullOrEmpty(cookieHeader)) + { + request.Headers.Add("Cookie", cookieHeader); + } + if (ajaxRequest) + { + request.Headers.Add("X-Requested-With", "XMLHttpRequest"); + } + var transaction = new Transaction + { + Request = request, + Response = await server.CreateClient().SendAsync(request), + }; + if (transaction.Response.Headers.Contains("Set-Cookie")) + { + transaction.SetCookie = transaction.Response.Headers.GetValues("Set-Cookie").SingleOrDefault(); + } + if (!string.IsNullOrEmpty(transaction.SetCookie)) + { + transaction.CookieNameValue = transaction.SetCookie.Split(new[] { ';' }, 2).First(); + } + transaction.ResponseText = await transaction.Response.Content.ReadAsStringAsync(); -// if (transaction.Response.Content != null && -// transaction.Response.Content.Headers.ContentType != null && -// transaction.Response.Content.Headers.ContentType.MediaType == "text/xml") -// { -// transaction.ResponseElement = XElement.Parse(transaction.ResponseText); -// } -// return transaction; -// } + if (transaction.Response.Content != null && + transaction.Response.Content.Headers.ContentType != null && + transaction.Response.Content.Headers.ContentType.MediaType == "text/xml") + { + transaction.ResponseElement = XElement.Parse(transaction.ResponseText); + } + return transaction; + } -// private class Transaction -// { -// public HttpRequestMessage Request { get; set; } -// public HttpResponseMessage Response { get; set; } + private class Transaction + { + public HttpRequestMessage Request { get; set; } + public HttpResponseMessage Response { get; set; } -// public string SetCookie { get; set; } -// public string CookieNameValue { get; set; } + public string SetCookie { get; set; } + public string CookieNameValue { get; set; } -// public string ResponseText { get; set; } -// public XElement ResponseElement { get; set; } -// } -// } -//} + public string ResponseText { get; set; } + public XElement ResponseElement { get; set; } + } + } +} diff --git a/test/Microsoft.AspNet.Identity.Test/SecurityStampValidatorTest.cs b/test/Microsoft.AspNet.Identity.Test/SecurityStampValidatorTest.cs index 2a514c3135..9c4636d230 100644 --- a/test/Microsoft.AspNet.Identity.Test/SecurityStampValidatorTest.cs +++ b/test/Microsoft.AspNet.Identity.Test/SecurityStampValidatorTest.cs @@ -44,20 +44,22 @@ namespace Microsoft.AspNet.Identity.Test var httpContext = new Mock(); var contextAccessor = new Mock(); contextAccessor.Setup(a => a.HttpContext).Returns(httpContext.Object); + var id = new ClaimsIdentity(IdentityOptions.ApplicationCookieAuthenticationScheme); + id.AddClaim(new Claim(ClaimTypes.NameIdentifier, user.Id)); + var principal = new ClaimsPrincipal(id); + var properties = new AuthenticationProperties { IssuedUtc = DateTimeOffset.UtcNow, IsPersistent = isPersistent }; var signInManager = new Mock>(userManager.Object, contextAccessor.Object, claimsManager.Object, options.Object, null); signInManager.Setup(s => s.ValidateSecurityStampAsync(It.IsAny(), user.Id)).ReturnsAsync(user).Verifiable(); - signInManager.Setup(s => s.SignInAsync(user, properties, null)).Returns(Task.FromResult(0)).Verifiable(); + signInManager.Setup(s => s.CreateUserPrincipalAsync(user)).ReturnsAsync(principal).Verifiable(); var services = new ServiceCollection(); services.AddInstance(options.Object); services.AddInstance(signInManager.Object); services.AddInstance(new SecurityStampValidator()); httpContext.Setup(c => c.RequestServices).Returns(services.BuildServiceProvider()); - var id = new ClaimsIdentity(IdentityOptions.ApplicationCookieAuthenticationScheme); - id.AddClaim(new Claim(ClaimTypes.NameIdentifier, user.Id)); - var ticket = new AuthenticationTicket(new ClaimsPrincipal(id), + var ticket = new AuthenticationTicket(principal, properties, IdentityOptions.ApplicationCookieAuthenticationScheme); var context = new CookieValidatePrincipalContext(httpContext.Object, ticket, new CookieAuthenticationOptions());