我想爲使用Asp.net在Visual Studio 2013中創建的Web API應用程序設置個人身份驗證。請告訴我,我該怎麼做。webAPI中的身份驗證
VS 2013默認情況下在設計時提供幾種類型的認證。我選擇個人身份驗證。但不知道它是如何工作的。
我想爲使用Asp.net在Visual Studio 2013中創建的Web API應用程序設置個人身份驗證。請告訴我,我該怎麼做。webAPI中的身份驗證
VS 2013默認情況下在設計時提供幾種類型的認證。我選擇個人身份驗證。但不知道它是如何工作的。
在服務器端創建身份驗證令牌並將其存儲在數據庫中,甚至存儲在緩存中。然後發送這個令牌與你的勝利形式應用程序的請求。 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並且修飾了它的方法和屬性。如果緩存內沒有任何內容,那麼請檢查數據庫。
這有點複雜!默認情況下,它是一個基於令牌的認證。檢查這些鏈接瞭解詳情:
個人帳戶中的ASP.NET Web API:http://www.asp.net/vnext/overview/authentication/individual-accounts-in-aspnet-web-api
瞭解OWIN Forms身份驗證選項:http://blogs.msdn.com/b/webdev/archive/2013/07/03/understanding-owin-forms-authentication-in-mvc-5.aspx#_Understanding_OWIN_Forms
也是這些鏈接將幫助: