5

Mam Web API, który jest obecnie używany przez aplikacje AngularJS w aplikacji sieci web ASP.NET MVC. Aplikacja MVC wykorzystuje uwierzytelnianie ASP.NET Forms jako mechanizm uwierzytelniania. W jaki sposób powinienem uwierzytelnić użytkownika Web API, gdy klient nie jest klientem internetowym, ale np. samodzielna usługa. Co zrobiłem teraz jest dodanie metodę logowania do sieci Web API, które daje każdemu prawo dostępu do mandatów:Jak uwierzytelnić użytkownika w Web API 2, gdy jest częścią starej aplikacji ASP.NET MVC?

[Route("api/v2/login"), HttpPost] 
[AllowAnonymous] 
public IHttpActionResult Post([FromBody]Credentials credentials) 
{ 
    var principal = FindPrincipal(credentials); 
    if (principal != null) 
    { 
     FormsAuthentication.SetAuthCookie(principal.Identity.Name, false); 
     return Ok(); 
    } 
    return Unauthorized(); 
} 

Moje pytanie brzmi, czy jest to w jaki sposób ten powinien zostać rozwiązany lub jeśli istnieje lepszy sposób?

Odpowiedz

2

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.

Powiązane problemy