c# – Windows窗体中的MVC WebAPI身份验证

c# – Windows窗体中的MVC WebAPI身份验证,第1张

概述我试图使一个 Windows窗体应用程序插入ASP.NET MVC WebAPI公开的一些服务,但身份验证/登录部分遇到了很多麻烦. 我似乎找不到一个例子,只是演示如何从Windows窗体中做到这一点,我发现的一切似乎是非常复杂的,包括很多非常深的管道,或者似乎针对其他ASP.NET网站,而不是Windows窗体. 有没有我失踪的东西?这是不可能吗?还是只是不打算?我已经看过像这样的.NET We 我试图使一个 Windows窗体应用程序插入ASP.NET MVC WebAPI公开的一些服务,但身份验证/登录部分遇到了很多麻烦.

我似乎找不到一个例子,只是演示如何从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身份验证所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1235844.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-06
下一篇2022-06-06

发表评论

登录后才能评论

评论列表(0条)

    保存