2014-03-05 124 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

这有点复杂!默认情况下,它是一个基于令牌的认证。检查这些链接了解详情:

也是这些链接将帮助: