コード例 #1
0
 public OPResult Delete(int clientId)
 {
     using (var db = new OAuthDbContext())
     {
         using (TransactionScope scope = new TransactionScope())
         {
             var auths  = db.ClientAuthorizations.Where(o => o.ClientId == clientId).ToArray();
             var client = db.Clients.Find(clientId);
             db.ClientAuthorizations.RemoveRange(auths);
             db.Clients.Remove(client);
             try
             {
                 db.SaveChanges();
                 scope.Complete();
             }
             catch (Exception e)
             {
                 return(new OPResult {
                     IsSucceed = false, Message = e.Message
                 });
             }
         }
     }
     return(new OPResult {
         IsSucceed = true
     });
 }
コード例 #2
0
 public OPResult Update(OAuth_Client client)
 {
     using (var db = new OAuthDbContext())
     {
         var exists = db.Clients.Any(o => o.ClientId != client.ClientId && (o.ClientIdentifier == client.ClientIdentifier || client.Name == o.Name));
         if (exists)
         {
             return(new OPResult {
                 IsSucceed = false, Message = "已存在相同名称或相同标识的其它商户"
             });
         }
         db.Entry(client).State = EntityState.Modified;
         try
         {
             db.SaveChanges();
         }
         catch (Exception e)
         {
             return(new OPResult {
                 IsSucceed = false, Message = e.Message
             });
         }
     }
     return(new OPResult {
         IsSucceed = true
     });
 }
コード例 #3
0
        public bool StoreNonce(string context, string nonce, DateTime timestampUtc)
        {
            if (!_dicContext.ContainsKey(context))
            {
                _dicContext.Add(context, this.ToMD5String(context));
            }

            using (var db = new OAuthDbContext())
            {
                db.Nonces.Add(new OAuth_Nonce {
                    Context = _dicContext[context], Code = nonce, Timestamp = timestampUtc
                });
                try
                {
                    db.SaveChanges();
                    return(true);
                }
                catch (SqlException)
                {
                    return(false);
                }
                catch (Exception e)
                {
                    return(false);
                }
            }
        }
コード例 #4
0
 public OPResult SaveClientAPIs(int clientId, IEnumerable <string> apis)
 {
     using (var db = new OAuthDbContext())
     {
         using (TransactionScope scope = new TransactionScope())
         {
             var capis = db.ClientOpenApis.Where(o => o.ClientId == clientId).ToArray();
             db.ClientOpenApis.RemoveRange(capis);
             foreach (var api in apis)
             {
                 db.ClientOpenApis.Add(new OAuth_ClientOpenApi {
                     ClientId = clientId, OpenApi = api
                 });
             }
             try
             {
                 db.SaveChanges();
                 scope.Complete();
             }
             catch (Exception e)
             {
                 return(new OPResult {
                     IsSucceed = false, Message = e.Message
                 });
             }
         }
     }
     return(new OPResult {
         IsSucceed = true
     });
 }
コード例 #5
0
 public AccountController(
     UserManager <User> userManager,
     OAuthDbContext applicationDbContext)
 {
     _userManager          = userManager;
     _applicationDbContext = applicationDbContext;
 }
コード例 #6
0
 public IEnumerable <OAuth_ClientOpenApi> GetClientApis(int clientId)
 {
     using (var db = new OAuthDbContext())
     {
         var apis = db.ClientOpenApis.Where(o => o.ClientId == clientId).ToArray();
         return(apis);
     }
 }
コード例 #7
0
 public IEnumerable <OAuth_Client> GetClients()
 {
     using (var db = new OAuthDbContext())
     {
         var clients = db.Clients.ToArray();
         return(clients);
     }
 }
コード例 #8
0
 // The following code creates the database and schema if they don't exist.
 // This is a temporary workaround since deploying database through EF migrations is
 // not yet supported in this release.
 // Please see this http://go.microsoft.com/fwlink/?LinkID=615859 for more information on how to do deploy the database
 // when publishing your application.
 private static void EnsureDatabaseCreated(OAuthDbContext context)
 {
     if (!_databaseChecked)
     {
         _databaseChecked = true;
         context.Database.EnsureCreated();
     }
 }
コード例 #9
0
 public ApiController(IDataProvider dataProvider,
                      OAuthDbContext dbContext,
                      IConfiguration configuration)
 {
     _dataProvider  = dataProvider ?? throw new ArgumentNullException(nameof(dataProvider));
     _dbContext     = dbContext ?? throw new ArgumentNullException(nameof(dbContext));
     _configuration = configuration ?? throw new ArgumentNullException(nameof(configuration));
 }
コード例 #10
0
 public OAuthController(IOptions <OAuthOptions> config,
                        IHttpClientFactory httpClientFactory,
                        OAuthDbContext dbContext)
 {
     _httpClientFactory = httpClientFactory ?? throw new ArgumentNullException();
     _dbContext         = dbContext;
     _oAuthOptions      = config?.Value ?? throw new ArgumentNullException();
 }
コード例 #11
0
 public OAuth_Client GetAccountClient(string accountName)
 {
     using (var db = new OAuthDbContext())
     {
         var client = db.Clients.FirstOrDefault(o => o.AccountName == accountName);
         return(client);
     }
 }
コード例 #12
0
        [AcceptVerbs(HttpVerbs.Get)]//HttpVerbs.Post
        //[Authorize]
        //[HttpHeader("x-frame-options", "SAMEORIGIN")] // mitigates clickjacking
        public ActionResult Authorize(string userkey)
        {
            var pendingRequest = this._authorizationServer.ReadAuthorizationRequest(Request);

            if (pendingRequest == null)
            {
                throw new HttpException((int)HttpStatusCode.BadRequest, "Missing authorization request.");
            }

            if (string.IsNullOrEmpty(userkey))
            {
                string        url = _authorizeUrl, callback = Request.Url.GetLeftPart(UriPartial.Path);
                StringBuilder querystring = new StringBuilder(string.Format("client_id={0}&", HttpUtility.UrlEncode(this.Request.QueryString["client_id"]))), callbackQuery = new StringBuilder();
                foreach (string key in this.Request.QueryString.Keys)
                {
                    if (!_queryParameters.Contains(key))
                    {
                        querystring.Append(string.Format("{0}={1}&", key, HttpUtility.UrlEncode(this.Request.QueryString[key])));
                    }
                    else
                    {
                        callbackQuery.Append(string.Format("{0}={1}&", key, HttpUtility.UrlEncode(this.Request.QueryString[key])));
                    }
                }
                if (callbackQuery.Length > 0)
                {
                    callback += ("?" + callbackQuery.ToString().TrimEnd('&'));
                    querystring.Append(string.Format("callback={0}&", HttpUtility.UrlEncode(callback)));
                }
                if (querystring.Length > 0)
                {
                    url += ("?" + querystring.ToString().TrimEnd('&'));
                }
                return(Redirect(url));
            }
            else
            {
                using (var db = new OAuthDbContext())
                {
                    var client = db.Clients.FirstOrDefault(o => o.ClientIdentifier == pendingRequest.ClientIdentifier);
                    if (client == null)
                    {
                        throw new Exception("不受信任的商户");
                    }
                    else
                    {
                        var user     = DESCrypt.Decrypt(userkey, client.ClientSecret);
                        var approval = this._authorizationServer.PrepareApproveAuthorizationRequest(pendingRequest, user);
                        var response = this._authorizationServer.Channel.PrepareResponse(approval);
                        return(response.AsActionResult());
                    }
                }
            }
        }
コード例 #13
0
 public void RemoveKey(string bucket, string handle)
 {
     using (var db = new OAuthDbContext())
     {
         var match = db.SymmetricCryptoKeys.FirstOrDefault(k => k.Bucket == bucket && k.Handle == handle);
         if (match != null)
         {
             db.SymmetricCryptoKeys.Remove(match);
             db.SaveChanges();
         }
     }
 }
コード例 #14
0
 public IEnumerable <KeyValuePair <string, CryptoKey> > GetKeys(string bucket)
 {
     using (var db = new OAuthDbContext())
     {
         var query = from key in db.SymmetricCryptoKeys
                     where key.Bucket == bucket
                     orderby key.ExpiresUtc descending
                     select key;
         var keys = query.ToList();
         return(keys.Select(k => new KeyValuePair <string, CryptoKey>(k.Handle, new CryptoKey(k.Secret, this.AsUtc(k.ExpiresUtc)))));
     }
 }
コード例 #15
0
        public CryptoKey GetKey(string bucket, string handle)
        {
            using (var db = new OAuthDbContext())
            {
                // It is critical that this lookup be case-sensitive, which can only be configured at the database.
                var matches = from key in db.SymmetricCryptoKeys
                              where key.Bucket == bucket && key.Handle == handle
                              select key;

                var k = matches.FirstOrDefault();
                return(new CryptoKey(k.Secret, this.AsUtc(k.ExpiresUtc)));
            }
        }
コード例 #16
0
        public override async Task ValidateClientAuthentication(
            OAuthValidateClientAuthenticationContext context)
        {
            string clientId;
            string clientSecret;

            if (context.TryGetBasicCredentials(out clientId, out clientSecret))
            {
                UserManager <IdentityUser> userManager =
                    context.OwinContext.GetUserManager <UserManager <IdentityUser> >();
                OAuthDbContext dbContext =
                    context.OwinContext.Get <OAuthDbContext>();

                try
                {
                    Client client = await dbContext
                                    .Clients
                                    .FirstOrDefaultAsync(clientEntity => clientEntity.Id == clientId);

                    if (client != null &&
                        userManager.PasswordHasher.VerifyHashedPassword(
                            client.ClientSecretHash, clientSecret) == PasswordVerificationResult.Success)
                    {
                        // Client has been verified.
                        context.OwinContext.Set <Client>("oauth:client", client);
                        context.Validated(clientId);
                    }
                    else
                    {
                        // Client could not be validated.
                        context.SetError("invalid_client", "Client credentials are invalid.");
                        context.Rejected();
                    }
                }
                catch
                {
                    // Could not get the client through the IClientManager implementation.
                    context.SetError("server_error");
                    context.Rejected();
                }
            }
            else
            {
                // The client credentials could not be retrieved.
                context.SetError(
                    "invalid_client",
                    "Client credentials could not be retrieved through the Authorization header.");

                context.Rejected();
            }
        }
コード例 #17
0
        public IClientDescription GetClient(string clientIdentifier)
        {
            using (var db = new OAuthDbContext())
            {
                var consumerRow = db.Clients.SingleOrDefault(
                    consumerCandidate => consumerCandidate.ClientIdentifier == clientIdentifier);
                if (consumerRow == null)
                {
                    throw new ArgumentOutOfRangeException("clientIdentifier");
                }

                return(new OAuthClientDescription(consumerRow));
            }
        }
コード例 #18
0
 /// <summary>
 /// 加密用户信息
 /// </summary>
 /// <param name="user">用户信息</param>
 /// <param name="clientid">商户标识</param>
 /// <returns>加密字符串</returns>
 public static string Encrypt(string user, string clientid)
 {
     using (var db = new OAuthDbContext())
     {
         var c = db.Clients.FirstOrDefault(o => o.ClientIdentifier == clientid);
         if (c == null)
         {
             throw new Exception("不受信任的商户");
         }
         byte[] key    = ToMD5(c.ClientSecret);
         byte[] buffer = Encoding.UTF8.GetBytes(user);
         byte[] cipher = Encrypt(buffer, key);
         return(Convert.ToBase64String(cipher));
     }
 }
コード例 #19
0
        public void StoreKey(string bucket, string handle, CryptoKey key)
        {
            var keyRow = new OAuth_SymmetricCryptoKey()
            {
                Bucket     = bucket,
                Handle     = handle,
                Secret     = key.Key,
                ExpiresUtc = key.ExpiresUtc,
            };

            using (var db = new OAuthDbContext())
            {
                db.SymmetricCryptoKeys.Add(keyRow);
                db.SaveChanges();
            }
        }
コード例 #20
0
        private string SaveClientAuthorization(string clientIdentifier, string userid, string scope, DateTime?expirationDateUtc)
        {
            string token = Guid.NewGuid().ToString().ToUpper();

            using (var db = new OAuthDbContext())
            {
                var query = from auth in db.ClientAuthorizations
                            from client in db.Clients
                            where
                            auth.ClientId == client.ClientId && client.ClientIdentifier == clientIdentifier &&
                            auth.UserId == userid
                            select auth;
                var clientAuth = query.FirstOrDefault();
                if (clientAuth == null)
                {
                    var client = db.Clients.FirstOrDefault(o => o.ClientIdentifier == clientIdentifier);
                    if (client == null)
                    {
                        throw new Exception("不受信任的商户!");
                    }

                    clientAuth = new OAuth_ClientAuthorization
                    {
                        ClientId          = client.ClientId,
                        CreatedOnUtc      = DateTime.Now,
                        Scope             = scope,
                        UserId            = userid,
                        Token             = token,
                        ExpirationDateUtc = expirationDateUtc
                    };
                    db.ClientAuthorizations.Add(clientAuth);
                }
                else
                {
                    clientAuth.CreatedOnUtc      = DateTime.Now;
                    clientAuth.Scope             = scope;
                    clientAuth.Token             = token;
                    clientAuth.ExpirationDateUtc = expirationDateUtc;
                }
                db.SaveChanges();
            }

            return(token);
        }
コード例 #21
0
        private AccessToken GetAccessToken(string accessToken)
        {
            using (var db = new OAuthDbContext())
            {
                var query = from auth in db.ClientAuthorizations
                            from client in db.Clients
                            where auth.ClientId == client.ClientId && auth.Token == accessToken
                            select new
                {
                    client.ClientIdentifier,
                    auth.UserId,
                    auth.Scope,
                    auth.ExpirationDateUtc,
                    auth.CreatedOnUtc
                };
                var clientAuth = query.FirstOrDefault();
                if (clientAuth == null)
                {
                    throw new Exception("当前AccessToken无效,请重新认证!");
                }

                else if (clientAuth.ExpirationDateUtc.HasValue && clientAuth.ExpirationDateUtc < DateTime.UtcNow)
                {
                    throw new Exception("当前AccessToken已过期!");
                }

                //token.UtcIssued和token.Lifetime此处可以不赋值(后续并没有用到)
                var token = new AccessToken
                {
                    ClientIdentifier = clientAuth.ClientIdentifier,
                    User             = clientAuth.UserId
                };

                var scopes = OAuthUtilities.SplitScopes(clientAuth.Scope);
                if (scopes.Count > 0)
                {
                    token.Scope.AddRange(scopes);
                }

                return(token);
            }
        }
コード例 #22
0
 public ActionResult LogOn(string username, string password, string returnUrl)
 {
     if (username == "admin" && password == ConfigurationManager.AppSettings["admin"])
     {
         FormsAuthentication.SetAuthCookie(username, false);
         return(Redirect(returnUrl));
     }
     else
     {
         using (var db = new OAuthDbContext())
         {
             if (db.Clients.Any(o => o.AccountName == username && o.AccountPassword == password))
             {
                 FormsAuthentication.SetAuthCookie(username, false);
                 return(Redirect(returnUrl));
             }
         }
     }
     ViewBag.LoginError = "用户名或密码有误!";
     return(View());
 }
コード例 #23
0
 public OPResult Create(OAuth_Client client)
 {
     using (var db = new OAuthDbContext())
     {
         var c = db.Clients.FirstOrDefault(o => o.ClientIdentifier == client.ClientIdentifier || client.Name == o.Name);
         if (c != null)
         {
             if (c.ClientIdentifier == client.ClientIdentifier)
             {
                 return new OPResult {
                            IsSucceed = false, Message = "已存在相同标识的商户"
                 }
             }
             ;
             else
             {
                 return new OPResult {
                            IsSucceed = false, Message = "已存在相同名称的商户"
                 }
             };
         }
         client = db.Clients.Add(client);
         try
         {
             db.SaveChanges();
         }
         catch (Exception e)
         {
             return(new OPResult {
                 IsSucceed = false, Message = e.Message
             });
         }
     }
     return(new OPResult <int> {
         IsSucceed = true, Result = client.ClientId
     });
 }
コード例 #24
0
        // GET: api/HealthCheck
        public HealthCheckModel Get()
        {
            bool dbStatus = true;

            try
            {
                OAuthDbContext dbContext = new OAuthDbContext("MobileOAuth");
                dbContext.Database.Connection.Open();
                dbContext.Database.Connection.Close();
            }
            catch (SqlException)
            {
                dbStatus = false;
            }

            var version = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;
            HealthCheckModel healthCheckModel = new HealthCheckModel()
            {
                Version         = version.ToString(),
                ConnectDBStatus = dbStatus
            };

            return(healthCheckModel);
        }
コード例 #25
0
 public AdminUserRepository(Func<OAuthDbContext> dbContextFactory)
 {
     this.dbContext = dbContextFactory.Invoke();
 }
コード例 #26
0
 public ApplicationRepository(Func<OAuthDbContext> dbContextFactory)
 {
     this.dbContext = dbContextFactory.Invoke();
 }
コード例 #27
0
 public DataProvider(IHttpClientFactory httpClientFactory, OAuthDbContext dbContext)
 {
     _httpClientFactory = httpClientFactory;
     _dbContext         = dbContext;
 }
コード例 #28
0
 public ApplicationRepository(Func <OAuthDbContext> dbContextFactory)
 {
     this.dbContext = dbContextFactory.Invoke();
 }
コード例 #29
0
 public AdminUserRepository(Func <OAuthDbContext> dbContextFactory)
 {
     this.dbContext = dbContextFactory.Invoke();
 }