Można użyć mechanizmu uwierzytelniania tokena dla WebApi2.
Przepływ będzie pewne rzeczy tak:
użytkowników wysłać żądanie HTTPS:
https://yourApiUrl/Token
zawartości rodzaj wniosku powinny być:
application/x-www-form-urlencoded
ciało powinno obejmują:
grant_type=password&username=yourWebsFormsUsername&password=yourWebFormsPassword
klasa startowy OWIN będzie wyglądać trochę coś takiego:
public partial class Startup
{
public static OAuthAuthorizationServerOptions OAuthOptions { get; private set; }
public static string PublicClientId { get; private set; }
public void ConfigureAuth(IAppBuilder app)
{
app.UseCookieAuthentication(new CookieAuthenticationOptions());
app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);
app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
PublicClientId = "self";
OAuthOptions = new OAuthAuthorizationServerOptions
{
TokenEndpointPath = new PathString("/Token"),
Provider = new YourOAuthProvider(),
AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"),
AccessTokenExpireTimeSpan = TimeSpan.FromDays(14),
AllowInsecureHttp = true,
};
app.UseOAuthBearerTokens(OAuthOptions);
}
}
Wskazówka YourOAuthProvider powyżej, to jest najważniejsze. To jest Twój niestandardowy dostawca, który sprawdzi Twoją nazwę użytkownika/hasło przed tym, co masz w pamięci. W twoim przypadku aspnet_membership table. Walidacja ta odbywa się poniżej w metodzie RequestHasValidCredentials:
public class YourOAuthProvider : OAuthAuthorizationServerProvider
{
public string apikey = string.Empty;
public override async Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
{
context.Validated();
}
public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
if (RequestHasValidCredentials(context.UserName, context.Password))
{
var id = new ClaimsIdentity(context.Options.AuthenticationType);
id.AddClaim(new Claim("username", context.UserName));
context.Validated(id);
}
else
{
context.SetError("invalid_grant", "The user name or password is incorrect.");
return;
}
}
}
odpowiedź Twój użytkownik będzie dostać się do powyższego będzie znak, który będzie zawierał nazwę użytkownika lub wszelkie inne informacje dodane do kontekstu w powyższej metody:
id.AddClaim(new Claim("username", context.UserName));
reponse z powyższego tokena wywołanie aPI będzie coś takiego:
{
"access_token": "9TIpW2m2rUbB_Bmb7kKAQ9GH4hgfnKF8g3fL0tAre2gcFjI45fajmG6qdOJe-A",
"token_type": "bearer",
"expires_in": 1209599
}
Twój użytkownik będzie musiał przejść ten token http nagłówek uthorization dla wszystkich wywołań API. Muszą zdać ten w użyciu schematu okaziciela, np .:
Bearer 9TIpW2m2rUbB_Bmb7kKAQ9GH4hgfnKF8g3fL0tAre2gcFjI45fajmG6qdOJe-A
jako token ten zawiera nazwę użytkownika, będziesz mógł wiedzieć, kim jest użytkownik. Ostatnia rzecz to teraz odczytać token i pobrać nazwę użytkownika. W tym celu należy utworzyć niestandardowy atrybut Authorize i udekorować swój kontroler lub metody.
public class YourAuthorizeAttribute : AuthorizationFilterAttribute
{
public override void OnAuthorization(HttpActionContext actionContext)
{
var ticket = Startup.OAuthOptions.AccessTokenFormat.Unprotect(actionContext.Request.Headers.Authorization.Parameter);
string username = claims.Where(x => x.Type == "username").FirstOrDefault();
base.OnAuthorization(actionContext);
}
}
wszystkie inne niestandardowe logiki autoryzacji można dodać tutaj, gdy masz już nazwę użytkownika.
Możesz przekazać inne niestandardowe informacje w momencie generowania tokena i przeczytać go tutaj. (w przypadku, gdy jest to potrzebne w przypadku jakiejkolwiek innej specjalnej logiki autoryzacji).
Długie podejście, ale zadziała, pozwoli na przechowywanie danych uwierzytelniających.