在 MVC 应用程序中组合 ASP.NET 成员身份验证和 HTTP 身份验证
Combine ASP.NET Membership auth and HTTP auth in MVC application
我有一个现有的 ASP.NET MVC 4.5 应用程序,它通过 .NET 成员资格对用户进行身份验证。我还想允许可选的基本 HTTP 身份验证代替成员身份,供无法使用浏览器登录的 DevOps 类型脚本(缓存预热、测试等)使用。
理想情况下,用于 HTTP 身份验证的凭据与成员资格中的凭据相同,但这并不重要。唯一关键的是,如果未提供 HTTP 凭据,网站用户将不会收到提示。
一种方法是覆盖 AuthorizeAttribute
的 OnAuthorize
方法,检查是否存在授权 header,如果找到,提取并验证凭据,然后然后手动创建 IPrincipal
。否则,请调用 base.OnAuthorization
以便通常的 .NET 成员身份发生。
来源:
public class RoleAuthorizeAttribute : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
bool basicValidated = false;
var req = filterContext.HttpContext.Request;
var auth = req.Headers["Authorization"];
if (!string.IsNullOrEmpty(auth))
{
var cred = System.Text.Encoding.ASCII.GetString(Convert.FromBase64String(auth.Substring(6))).Split(':');
var userName = cred[0];
var pass = cred[1];
var membership = new AccountMembershipService();
basicValidated = membership.ValidateUser(userName, pass);
if (!basicValidated)
{
base.OnAuthorization(filterContext);
}
else
{
var roles = System.Web.Security.Roles.GetRolesForUser(userName);
IPrincipal principal = new GenericPrincipal(
new GenericIdentity(userName),roles);
Thread.CurrentPrincipal = principal;
System.Web.HttpContext.Current.User = principal;
}
} else
{
base.OnAuthorization(filterContext);
}
}
}
我有一个现有的 ASP.NET MVC 4.5 应用程序,它通过 .NET 成员资格对用户进行身份验证。我还想允许可选的基本 HTTP 身份验证代替成员身份,供无法使用浏览器登录的 DevOps 类型脚本(缓存预热、测试等)使用。
理想情况下,用于 HTTP 身份验证的凭据与成员资格中的凭据相同,但这并不重要。唯一关键的是,如果未提供 HTTP 凭据,网站用户将不会收到提示。
一种方法是覆盖 AuthorizeAttribute
的 OnAuthorize
方法,检查是否存在授权 header,如果找到,提取并验证凭据,然后然后手动创建 IPrincipal
。否则,请调用 base.OnAuthorization
以便通常的 .NET 成员身份发生。
来源:
public class RoleAuthorizeAttribute : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
bool basicValidated = false;
var req = filterContext.HttpContext.Request;
var auth = req.Headers["Authorization"];
if (!string.IsNullOrEmpty(auth))
{
var cred = System.Text.Encoding.ASCII.GetString(Convert.FromBase64String(auth.Substring(6))).Split(':');
var userName = cred[0];
var pass = cred[1];
var membership = new AccountMembershipService();
basicValidated = membership.ValidateUser(userName, pass);
if (!basicValidated)
{
base.OnAuthorization(filterContext);
}
else
{
var roles = System.Web.Security.Roles.GetRolesForUser(userName);
IPrincipal principal = new GenericPrincipal(
new GenericIdentity(userName),roles);
Thread.CurrentPrincipal = principal;
System.Web.HttpContext.Current.User = principal;
}
} else
{
base.OnAuthorization(filterContext);
}
}
}