2014-04-29 6 views
13
public class SimpleAuthorizationServerProvider : OAuthAuthorizationServerProvider 
{ 
    public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context) 
    { 
     bool isvalidUser = AuthenticateUser(context.UserName, context.Password);// validate my user&password 
     if (!isvalidUser) 
     { 
      context.Rejected(); 
      return; 
     } 
     // create identity 
     var id = new ClaimsIdentity(context.Options.AuthenticationType); 
     id.AddClaim(new Claim("sub", context.UserName)); 
     id.AddClaim(new Claim("role", "user")); 

     // create metadata to pass on to refresh token provider 
     var props = new AuthenticationProperties(new Dictionary<string, string> 
      { 
       { "as:client_id", context.ClientId } 
      }); 

     var ticket = new AuthenticationTicket(id, props); 
     context.Validated(ticket); 
    } 
} 

tempo Accesso Sto usando questo SimpleAuthorizationServerProvider (in Api Web) posso ricevere e inviare token di accesso al client. Anche in questo caso Accesso utente deve accedere a altre pagine, Come posso convalidare la mia personalizzato token di accesso OAuth2 a lato server (in Api Web)Come posso convalidare la mia personalizzato token di accesso OAuth2 nel lato server

Da lato client Sono gettone generazione come questo

private static TokenResponse GetToken() 
{ 
    var client = new OAuth2Client(new Uri("http://localhost:1142/token"), "client1", "secret"); 
    var response = client.RequestResourceOwnerPasswordAsync(uid, pwd).Result; 
    Console.WriteLine(response.AccessToken); 
    return response; 
} 

e call particolare web API dopo l'autenticazione come questa

private static void CallProfile(string token) 
{ 
    var client = new HttpClient(); 
    client.SetBearerToken(token); 
    var response = client.GetStringAsync(new Uri("http://localhost:1142/api/Profile?id=1")).Result; 
} 
+1

Basta parlare dal mio cappello qui, ma se il token portatore viene restituito nell'intestazione Autorizzazione poi una semplice chiamata a User.Identity.IsAuthenticated dovrebbe dirti se il token è valido o meno. – Mark

+1

@Mark - potrebbe essere, tuttavia, cosa succede quando il metodo viene chiamato tramite una richiesta Ajax e non vi è User.Identity collegato alla richiesta? – Catchops

+0

@Catchops È necessario passare il token nell'intestazione Autorizzazione della richiesta (ad esempio Autorizzazione: Bearer YOUR_TOKEN) quando si effettua la richiesta AJAX. – Mark

risposta

2

In realtà, OWIN gestisce quasi tutto per te. Se si utilizza ASP.NET API v2 Server per ricevere richieste. Devi solo passare il tuo token nelle tue richieste http nel formato giusto.

1. Invia http richiesta

Ci sono 2 modi per passare il token:

2. autenticare la richiesta

È possibile utilizzare (ClaimsPrincipal)Thread.CurrentPrincipal.Identity.IsAuthenticated per verificare se la requested token è valido

3. autorizzare la vostra richiesta

È possibile utilizzare l'attributo [Authorize] o Puoi scrivere tu stesso AuthorizeAttribute

Se implementi il ​​tuo Attributo, puoi fare cose più interessanti: connettiti al Database per fare un'autorizzazione complessa.

penso, questo è un buon documento di iniziare con OAuth2 in ASP.NET Web Api: http://bitoftech.net/2014/06/01/token-based-authentication-asp-net-web-api-2-owin-asp-net-identity/

+0

Salve, cosa succede se inviamo il token in un cookie, quindi come impostare l'intestazione di autorizzazione? Lo facciamo in "AuthorizeAttribute" o è troppo tardi per allora? – DevEng

Problemi correlati