2017-07-17 5 views
2

Ich versuche, einen Benutzer in Web-API ohne ihre Benutzername/Passwort-Kombination zu unterzeichnen. Ich habe Zugriff auf das Benutzerobjekt für den Benutzer, muss diese jedoch "anmelden" und das Zugriffstoken für nachfolgende Anforderungen an die Clientanwendung zurückgeben.WebAPI erhalten Zugang Token ohne Benutzername und Passwort

Ich habe versucht, Variationen über das folgende, aber ohne Glück, das UserManager Objekt wird so bald angeordnet, wie ich GenerateUserIdentityAsync das erste Mal aufrufen, die es für die cookiesIdentity scheitern verursacht und seine mich warnen, dass mein Guss OAuthGrantResourceOwnerContextCredentials ist ein " Verdächtige Typumwandlung oder Überprüfung "aber der Code erreicht diese Zeile nie; Dies ist, was ich versucht habe, die von der GrantResourceOwnerCredentials Methode meiner ApplicationOAuthProvider Klasse genommen und geändert wurde. Übrigens funktioniert mein Token-Endpunkt perfekt mit den üblichen username, password und grant_type Anfragen.

var user = // Super secret way of getting the user....; 
Authentication.SignOut(DefaultAuthenticationTypes.ExternalCookie); 
// UserManager is not null at this point 
var oAuthIdentity = await user.GenerateUserIdentityAsync(UserManager, 
       OAuthDefaults.AuthenticationType); 
// UserManager is null at this point and so throws exception 
var cookiesIdentity = await user.GenerateUserIdentityAsync(UserManager, 
       CookieAuthenticationDefaults.AuthenticationType); 

var properties = ApplicationOAuthProvider.CreateProperties(user.UserName); 
var ticket = new AuthenticationTicket(oAuthIdentity, properties); 


((OAuthGrantResourceOwnerCredentialsContext)HttpContext.Current.GetOwinContext().Request.Context) 
      .Validated(ticket); 
     HttpContext.Current.GetOwinContext().Request.Context.Authentication.SignIn(cookiesIdentity); 

Im Grunde alles, was ich tun möchte, ist ein Zugriffstoken für einen Benutzer zurückgeben, für die ich nicht habe den Benutzernamen und das Passwort, sondern ein „Geheimnis“, dass ich anstelle von Benutzername Passwort verwenden möchten. Gibt es einen Weg?

Antwort

1

OK so nach viel Graben ich this article gefunden, die mir diesen Code setzen half zusammen, die wie ein Zauber funktioniert:

var user = // Super secret method of getting the user 
var tokenExpiration = TimeSpan.FromDays(1); 
ClaimsIdentity identity = new ClaimsIdentity(OAuthDefaults.AuthenticationType); 
identity.AddClaim(new Claim(ClaimTypes.Name, user.UserName)); 
identity.AddClaim(new Claim("role", "user")); 
var props = new AuthenticationProperties() 
{ 
    IssuedUtc = DateTime.UtcNow, 
    ExpiresUtc = DateTime.UtcNow.Add(tokenExpiration), 
}; 
var ticket = new AuthenticationTicket(identity, props); 
var accessToken = Startup.OAuthOptions.AccessTokenFormat.Protect(ticket); 
JObject tokenResponse = new JObject(
    new JProperty("userName", user.UserName), 
    new JProperty("access_token", accessToken), 
    new JProperty("token_type", "bearer"), 
    new JProperty("expires_in", tokenExpiration.TotalSeconds.ToString()), 
    new JProperty(".issued", 
     ticket.Properties.IssuedUtc.GetValueOrDefault().DateTime.ToUniversalTime()), 
    new JProperty(".expires", 
     ticket.Properties.ExpiresUtc.GetValueOrDefault().DateTime.ToUniversalTime())); 
return tokenResponse; 
Verwandte Themen