2014-03-05 67 views
0

我想爲使用Asp.net在Visual Studio 2013中創建的Web API應用程序設置個人身份驗證。請告訴我,我該怎麼做。webAPI中的身份驗證

VS 2013默認情況下在設計時提供幾種類型的認證。我選擇個人身份驗證。但不知道它是如何工作的。

回答

2

在服務器端創建身份驗證令牌並將其存儲在數據庫中,甚至存儲在緩存中。然後發送這個令牌與你的勝利形式應用程序的請求。 WebApi應該始終檢查此令牌。它足夠好,你可以完全控制你的認證過程。

基本上它和Darin的答案很相似。

讓我分享,它是如何工作對我來說:

對象與驗證的細節:

public class TokenIdentity 
{ 
    public int UserID { get; set; } 

    public string AuthToken { get; set; } 

    public ISocialUser SocialUser { get; set; } 
} 

的Web API驗證控制器:

public class AuthController : ApiController 
    { 
     public TokenIdentity Post(
      SocialNetwork socialNetwork, 
      string socialUserID, 
      [FromUri]string socialAuthToken, 
      [FromUri]string deviceRegistrationID = null, 
      [FromUri]DeviceType? deviceType = null) 
     { 
      var socialManager = new SocialManager(); 

      var user = socialManager.GetSocialUser(socialNetwork, socialUserID, socialAuthToken); 

      var tokenIdentity = new AuthCacheManager() 
       .Authenticate(
        user, 
        deviceType, 
        deviceRegistrationID); 

      return tokenIdentity; 
     } 
    } 

驗證高速緩存管理器:

public class AuthCacheManager : AuthManager 
    { 
     public override TokenIdentity CurrentUser 
     { 
      get 
      { 
       var authToken = HttpContext.Current.Request.Headers["AuthToken"]; 
       if (authToken == null) return null; 

       if (HttpRuntime.Cache[authToken] != null) 
       { 
        return (TokenIdentity) HttpRuntime.Cache.Get(authToken); 
       } 

       return base.CurrentUser; 
      } 
     } 

     public int? CurrentUserID 
     { 
      get 
      { 
       if (CurrentUser != null) 
       { 
        return CurrentUser.UserID; 
       } 
       return null; 
      } 
     } 

     public override TokenIdentity Authenticate(
      ISocialUser socialUser, 
      DeviceType? deviceType = null, 
      string deviceRegistrationID = null) 
     { 
      if (socialUser == null) throw new ArgumentNullException("socialUser"); 
      var identity = base.Authenticate(socialUser, deviceType, deviceRegistrationID); 

      HttpRuntime.Cache.Add(
       identity.AuthToken, 
       identity, 
       null, 
       DateTime.Now.AddDays(7), 
       Cache.NoSlidingExpiration, 
       CacheItemPriority.Default, 
       null); 

      return identity; 
     } 
    } 

驗證經理:

public abstract class AuthManager 
    { 
     public virtual TokenIdentity CurrentUser 
     { 
      get 
      { 
       var authToken = HttpContext.Current.Request.Headers["AuthToken"]; 
       if (authToken == null) return null; 

       using (var usersRepo = new UsersRepository()) 
       { 
        var user = usersRepo.GetUserByToken(authToken); 

        if (user == null) return null; 

        return new TokenIdentity 
        { 
         AuthToken = user.AuthToken, 
         SocialUser = user, 
         UserID = user.ID 
        }; 
       } 
      } 
     } 

     public virtual TokenIdentity Authenticate(
      ISocialUser socialUser, 
      DeviceType? deviceType = null, 
      string deviceRegistrationID = null) 
     { 
      using (var usersRepo = new UsersRepository()) 
      { 
       var user = usersRepo.GetUserBySocialID(socialUser.SocialUserID, socialUser.SocialNetwork); 

       user = (user ?? new User()).CopyFrom(socialUser); 

       user.AuthToken = System.Guid.NewGuid().ToString(); 

       if (user.ID == default(int)) 
       { 
        usersRepo.Add(user); 
       } 

       usersRepo.SaveChanges(); 

       return new TokenIdentity 
       { 
        AuthToken = user.AuthToken, 
        SocialUser = user, 
        UserID = user.ID 
       }; 
      } 
     } 
    } 

全球行動篩選:

public class TokenAuthenticationAttribute : System.Web.Http.Filters.ActionFilterAttribute 
{ 
    public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext actionContext) 
    { 
     if (actionContext.Request.RequestUri.AbsolutePath.Contains("api/auth")) 
     { 
      return; 
     } 

     var authManager = new AuthCacheManager(); 

     var user = authManager.CurrentUser; 

     if (user == null) 
     { 
      throw new HttpResponseException(HttpStatusCode.Unauthorized); 
     } 

     //Updates the authentication 
     authManager.Authenticate(user.SocialUser); 
    } 
} 

Global.asax中註冊:

GlobalConfiguration.Configuration.Filters.Add(new AuthFilterAttribute()); 

這個想法是AuthCacheManager擴展了AuthManager並且修飾了它的方法和屬性。如果緩存內沒有任何內容,那麼請檢查數據庫。

0

這有點複雜!默認情況下,它是一個基於令牌的認證。檢查這些鏈接瞭解詳情:

也是這些鏈接將幫助: