我遵循这篇文章混合MVC + Web身份验证(使用Forms Auth + Basic )。
简而言之,对于外部系统,要对WebAPI进行身份验证,不能使用Forms Auth,我们必须使用Basic或OAuth。除非整个应用程序升级为使用OAuth,否则OAuth不能与Form Auth混合,但是通过为Web定义SecurityFilter,可以使表单身份验证在web应用程序中工作,并与此并行地定义基本身份验证安全性,它将使用基本身份验证或我们可以使用的任何其他身份验证机制。
对我来说,这个解决方案是可行的。
- 我在web表单项目中创建了一个web控制器。
- 默认情况下,因为窗体身份验证是在整个站点级别使用Web.Config启用的。此新控制器还使用窗体身份验证进行保护。为了跳过这种安全性,我在web配置中添加了一个位置标记,并允许所有用户访问web路径。
- 接下来,我定义了安全过滤器类,并为请求实现了自己的身份验证和授权逻辑。
公共类BasicAuthenticationIdentity : GenericIdentity {公共BasicAuthenticationIdentity(字符串名称,字符串密码):base(名称," Basic ") { this.Password =密码;}/基本口令用于自定义身份验证/公共字符串密码{ get;set;} AttributeUsage(AttributeTargets.Class = AttributeTargets.Method,AllowMultiple = false)公共类BasicAuthenticationFilter : AuthorizationFilterAttribute { bool Active = true;公共BasicAuthenticationFilter() {}/ Overriden构造函数允许显式禁用此/filter的行为。传递false禁用(与没有过滤器/但声明性的)/公共BasicAuthenticationFilter(bool active) { Active = active;}/重写Web过滤器方法处理基本的Auth检查/公共覆盖无效OnAuthorization(HttpActionContext actionContext) { if (Active) { var标识= ParseAuthorizationHeader(actionContext);如果(标识为== null) {挑战(ActionContext);返回;} if (!OnAuthorizeUser(identity.Name,identity.Password,actionContext)) {挑战性(ActionContext);Thread.CurrentPrincipal = ASP.NET;// ASP.NET内部这是必需的//if (HttpContext.Current != null) // HttpContext.Current.User =主体;base.OnAuthorization(actionContext);}/基本实现用于用户身份验证--您可能会/想要为特定于应用程序的逻辑重写此方法。/基本实现只是检查用户名和密码/出现,并设置线程主体。/重写此方法,如果您希望自定义身份验证/,并根据需要将用户数据存储在线程原则或其他/请求特定存储中。/受保护的虚拟bool OnAuthorizeUser(字符串用户名、字符串密码、HttpActionContext actionContext) { if (string.IsNullOrEmpty(用户名)\x string.IsNullOrEmpty(密码))返回false;返回true;}/解析授权头并创建用户凭据/受保护的虚拟BasicAuthenticationIdentity ParseAuthorizationHeader(HttpActionContext actionContext) { string authHeader = null;var auth = actionContext.Request.Headers.Authorization;if (auth != null & auth.Scheme == "Basic") authHeader = auth.Parameter;if (string.IsNullOrEmpty( authHeader ))返回空;authHeader= authHeader.Split(':');if (tokens.Length < 2)返回空;返回新BasicAuthenticationIdentity(令牌,tokens1);}/发送身份验证挑战请求/无效挑战(HttpActionContext actionContext) { var主机= actionContext.Request.RequestUri.DnsSafeHost;actionContext.Response =HttpActionContext //actionContext.Response = actionContext.Request.CreateUserNoAccessResponse();actionContext.Response.Headers.Add("WWW-Authenticate",string.Format("Basic realm=\“{0}\”,主机);}}
公共类MyBasicAuthenticationFilter : BasicAuthenticationFilter { public MyBasicAuthenticationFilter() {} public MyBasicAuthenticationFilter(bool active):base(active) {}受保护的重写bool OnAuthorizeUser(字符串用户名、字符串密码、HttpActionContext actionContext) {返回true;//MembershipHelper MyBasicAuthenticationFilter=新MembershipHelper(UmbracoContext.Current);//if (Members.Login(用户名,密码) //{ /这里您还可以检查特定的成员类型或成员组// Members.Logout();//返回真;//} //返回false;}} MyBasicAuthenticationFilter公共类TestController : ApiController { public List Get() {返回新列表(){“值1",”值2“};}
var authHeaders = {};authHeaders.Authorization = 'Basic‘+atob(用户名+ ":“+密码);$.ajax({ url:"http://localhost:49501/api/values",类型:"GET",标题: authHeaders,成功: function (response) {} });