Ich habe gelernt, dass OWIN hat diese große Bibliothek, mit der Sie Ihre Web-Anwendung In-Memory testen können. Meine Website erfordert jedoch eine Authentifizierung, bevor auf Ressourcen zugegriffen werden kann, die das Schreiben von Testcode erschwert haben.Wie Einheit Testcode, der OWIN Cookie Authentifizierung verwendet
Gibt es eine bequeme Möglichkeit, Authentifizierung bei Verwendung von Microsoft.Owin.Testing zu "mock"?
Ich möchte, dass meine Komponententests nicht auf einen veralteten STS treffen müssen, und ich möchte lieber keinen Code schreiben, der sich programmgesteuert bei einem In-Memory-STS anmeldet (z. B. Thinktecture.IdentityServer.v3)).
Die einfachste Lösung, die ich habe, ist, den Authentifizierungscode für die Komponententests zu deaktivieren, von denen ich kein Fan bin.
Ich verwende OpenID Connect mit Cookie-Authentifizierung. Hier ist ein enthaltenes Beispiel. Die Konfigurationszeichenfolgen für OpenId Connect müssen für einen tatsächlichen Server ausgefüllt werden.
[Test]
public async void AccessAuthenthicatedResourceTest()
{
const string ClientId = "";
const string RedirectUri = "";
const string Authority = "";
TestServer server = TestServer.Create(
app =>
{
//Configure Open ID Connect With Cookie Authenthication
app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
app.UseCookieAuthentication(new CookieAuthenticationOptions());
app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
{
ClientId = ClientId,
RedirectUri = RedirectUri,
Authority = Authority
});
// Requires Authentication
app.Use(
async (context, next) =>
{
var user = context.Authentication.User;
if (user == null
|| user.Identity == null
|| !user.Identity.IsAuthenticated)
{
context.Authentication.Challenge();
return;
}
await next();
});
app.Run(async context => await context.Response.WriteAsync("My Message"));
});
//Do or Bypass authenthication
HttpResponseMessage message = await server.CreateRequest("/").GetAsync();
Assert.AreEqual("My Message", await message.Content.ReadAsStringAsync());
}