1: public class AuthenticateAttribute:FilterAttribute,IAuthenticationFilter
2: {
3: public const string AuthorizationHeaderName ="Authorization";
4: public const string WwwAuthenticationHeaderName ="WWW-Authenticate";
5: public const string BasicAuthenticationScheme ="Basic";
6: private static Dictionary<string, string> userAccounters;
7:
8: static AuthenticateAttribute()
9: {
10: userAccounters = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
11:
12: userAccounters.Add("Foo", "Password");
13: userAccounters.Add("Bar", "Password");
14: userAccounters.Add("Baz", "Password");
15: }
16:
17: public void OnAuthentication(AuthenticationContext filterContext)
18: {
19: IPrincipal user;
20: if (this.IsAuthenticated(filterContext, out user))
21: {
22: filterContext.Principal = user;
23: }
24: else
25: {
26: this.ProcessUnauthenticatedRequest(filterContext);
27: }
28: }
29:
30: protected virtual AuthenticationHeaderValue GetAuthenticationHeaderValue(AuthenticationContext filterContext)
31: {
32: string rawValue = filterContext.RequestContext.HttpContext.Request.Headers[AuthorizationHeaderName];
33: if (string.IsNullOrEmpty(rawValue))
34: {
35: return null;
36: }
37: string[] split = rawValue.Split(' ');
38: if (split.Length != 2)
39: {
40: return null;
41: }
42: return new AuthenticationHeaderValue(split[0], split[1]);
43: }
44:
45: protected virtual bool IsAuthenticated(AuthenticationContext filterContext, out IPrincipal user)
46: {
47: user = filterContext.Principal;
48: if (null != user & user.Identity.IsAuthenticated)
49: {
50: return true;
51: }
52:
53: AuthenticationHeaderValue token = this.GetAuthenticationHeaderValue(filterContext);
54: if (null != token && token.Scheme == BasicAuthenticationScheme)
55: {
56: string credential = Encoding.Default.GetString(Convert.FromBase64String(token.Parameter));
57: string[] split = credential.Split(':');
58: if (split.Length == 2)
59: {
60: string userName = split[0];
61: string password;
62: if (userAccounters.TryGetValue(userName, out password))
63: {
64: if (password == split[1])
65: {
66: GenericIdentity identity = new GenericIdentity(userName);
67: user = new GenericPrincipal(identity, new string[0]);
68: return true;
69: }
70: }
71: }
72: }
73: return false;
74: }
75:
76: protected virtual void ProcessUnauthenticatedRequest(AuthenticationContext filterContext)
77: {
78: string parameter = string.Format("realm=\"{0}\"", filterContext.RequestContext.HttpContext.Request.Url.DnsSafeHost);
79: AuthenticationHeaderValue challenge = new AuthenticationHeaderValue(BasicAuthenticationScheme, parameter);
80: filterContext.HttpContext.Response.Headers[WwwAuthenticationHeaderName] = challenge.ToString();
81: filterContext.Result = new HttpUnauthorizedResult();
82: }
83:
84: public void OnAuthenticationChallenge(AuthenticationChallengeContext filterContext) {}
85: }