Ich lerne, neue benutzerdefinierte Middleware (externe Anmeldung) in WebApi zu implementieren, um Benutzer zu authentifizieren. Ich habe eine leere Vorlage verwendet, um zu lernen, was eigentlich läuft.Benutzer als authentifiziert von WebAPI benutzerdefinierte Middleware setzen
Ich habe ein paar gute Artikel und externe Anmeldung benutzerdefinierte Middleware-Anbieter Links, um mir zu helfen, dies zu erreichen.
- http://bitoftech.net/2014/08/11/asp-net-web-api-2-external-logins-social-logins-facebook-google-angularjs-app/
- https://www.simple-talk.com/dotnet/net-framework/creating-custom-oauth-middleware-for-mvc-5/
- https://github.com/TerribleDev/OwinOAuthProviders
- https://katanaproject.codeplex.com/SourceControl/latest#README
Basierend auf diesen Artikel fertig i benutzerdefinierte Middleware für Github und den Benutzer erfolgreich authentifiziert.
Jetzt muss ich verstehen, wie das Webapi-Identity-System den Benutzer authentifizierte und wie die externen Ansprüche dafür gespeichert werden. Nachdem ich mich erfolgreich von Dritten angemeldet habe, habe ich gerade Ansprüche erstellt und die SignIn-Methode aufgerufen.
Bis zu diesem alles richtig funktioniert.
Aber nachdem ich versucht habe, auf eine geschützte Ressource mit dem Zugriffstoken (das ist ein externer Zugriffstoken) zuzugreifen, habe ich nur Unauthorized. Ich nahm an, dass, da ich den Benutzer nicht zur lokalen Datenbank registriere, ich das gleiche externe Zugangstoken verwenden kann, um die Ressource zu benutzen.
Ich habe 2 Möglichkeiten ausprobiert. Zuerst wurde ich in der ExternalLogin-Methode selbst nach der Anmeldung zu der geschützten Ressource umgeleitet. Als nächstes versuchte ich mit Rest-Client.
Meine Auth Konfiguration Code:
[assembly: OwinStartup(typeof(CustomExternalLogin.Startup))]
namespace CustomExternalLogin
{
public class Startup
{
public void Configuration(IAppBuilder app)
{
// 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
app.UseCookieAuthentication(new CookieAuthenticationOptions());
app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);
//Use Git authentication
app.UseGitAuthentication("myclientid", "myclientsecret");
}
}
}
Mein Controller-Code
[Authorize]
[RoutePrefix("api/Account")]
public class AccountController : ApiController
{
[OverrideAuthorization]
[HostAuthentication(DefaultAuthenticationTypes.ExternalCookie)]
[AllowAnonymous]
[Route("ExternalLogin", Name ="ExternalLogin")]
public async Task<IHttpActionResult> GetExternalLogin(string provider, string error = null)
{
string redirectUri = string.Empty;
//Check any error and return
if(error != null)
{
return BadRequest(Uri.EscapeDataString(error));
}
//if not current user is authenticated return challengeresult so that middleware continue for external authentication
if (!User.Identity.IsAuthenticated)
{
return new ChallengeResult(provider, this);
}
ClaimsIdentity externalIdentity = User.Identity as ClaimsIdentity;
Claim providerClaim = externalIdentity.FindFirst(ClaimTypes.NameIdentifier);
Claim userClaim = externalIdentity.FindFirst(ClaimTypes.Name);
string token = externalIdentity.FindFirstValue("ExternalAccessToken");
IEnumerable<Claim> claims = new List<Claim>
{
new Claim(ClaimTypes.NameIdentifier, providerClaim.Value, null, providerClaim.Issuer),
new Claim(ClaimTypes.Name, userClaim.Value, null, userClaim.Issuer)
};
ClaimsIdentity identity = new ClaimsIdentity(claims, OAuthDefaults.AuthenticationType);
Authentication.SignIn(identity);
Uri currentUri = Request.RequestUri;
string home = currentUri.Scheme + Uri.SchemeDelimiter + currentUri.Authority + currentUri.Segments[0] + currentUri.Segments[1] + "Home/User?access_token=Bearer " + token ;
return Redirect(home);
}
#region Helpers
private IAuthenticationManager Authentication
{
get { return Request.GetOwinContext().Authentication; }
}
#endregion
}
}
Mein geschützte Ressource Code:
[Authorize]
[Route("User", Name ="User")]
public string GetUser()
{
var authentication = Request.GetOwinContext().Authentication;
return "Welcome " + User.Identity.Name;
}
Bitte helfen Sie mir, wo ich zu finden misse d
Edit 1:
bekam ich die aktuelle Ausgabe. Ich habe versucht, mit External Token zuzugreifen. WebAPI Authorize verifiziert das Token mit local, so dass es immer fehlgeschlagen ist. Die Lösung besteht also darin, ein lokales Zugriffstoken zu erstellen, und ich bin fertig. Funktioniert gut.
Aber zur Zeit überprüfe ich, warum die Authentication.Signin() -Methode kein Token für mich erstellt hat?
In Ihrem Startup.cs erklären, haben Sie versucht, Einstellung Ihre Standardanmeldung Middleware wie folgt: 'app.SetDefaultSignInAsAuthenticationType (CookieAuthenticationDefaults.AuthenticationType);'? Dies sollte die erste Zeile dort sein. – juunas
@juunas jetzt habe ich versucht, indem Sie diese Zeile als erste Zeile hinzufügen. Aber immer noch gleich. Ich denke, das ist Standard als "Cookies:" Nach der Authentifizierung.Signieren, wenn ich Anmeldeversuche Authentifizierungstyp ist "Bearer", also jede andere Konfiguration für Bearer-Token – Akhil