
我似乎找不到一个例子,只是演示如何从windows窗体中做到这一点,我发现的一切似乎是非常复杂的,包括很多非常深的管道,或者似乎针对其他ASP.NET网站,而不是windows窗体.
有没有我失踪的东西?这是不可能吗?还是只是不打算?我已经看过像这样的.NET WebApi Authentication这样的事情,但是我没有看到如何使用windows窗体方面的cookie.我也已经过了http://blogs.msdn.com/b/webdev/archive/2012/08/26/asp-net-web-api-and-httpclient-samples.aspx,仍然有很少的运气.
解决方法 只需在服务器端创建身份验证令牌,并将其存储在数据库或甚至缓存中.然后发送这个令牌与您的win表单应用程序的请求. WebAPI应该一直检查这个令牌.这足够好,您可以完全控制您的验证过程.让我分享一下,它对我有用:
对象与Auth详细信息:
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,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,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,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并修饰了它的方法和属性.如果缓存内没有任何内容,请检查数据库.
总结以上是内存溢出为你收集整理的c# – Windows窗体中的MVC WebAPI身份验证全部内容,希望文章能够帮你解决c# – Windows窗体中的MVC WebAPI身份验证所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)